Fluent Mybatis零xml配置實現復雜嵌套查詢

嵌套查詢

使用Fluent Mybatis, 不用手寫一行xml文件或者Mapper文件,在dao類中即可使用java api構造中比較復雜的嵌套查詢。
讓dao的代碼邏輯和sql邏輯合二為一。

前置準備,maven工程設置

參考文章 使用FluentMybatis實現mybatis動態sql拼裝和fluent api語法

in (select 子查詢)

 嵌套查詢表和主查詢表一樣的場景

.column().in( query-> {對query設置條件})

隻需要在in裡面引用一個lambda表達式,lambda表達式入參是一個同名的Query。對這個入參可以設置where參數。

@DisplayName("嵌套查詢和主查詢的表是同一個")
@Test
void test_in_same_table_query() {
    UserQuery query = new UserQuery()
        .where.id().in(q -> q.selectId()
            .where.id().eq(3L).end())
        .and.userName().like("user")
        .and.age().gt(23).end();

    List list = mapper.listEntity(query);
    
    // 通過Test4J工具,驗證sql語句
    db.sqlList().wantFirstSql()
        .eq("SELECT id, gmt_create, gmt_modified, is_deleted, account, age, avatar, birthday, bonus_points, e_mail, password, phone, status, user_name " +
            "FROM user WHERE id IN (SELECT id FROM user WHERE id = ?) " +
            "AND user_name LIKE ? " +
            "AND age > ?");
}

嵌套查詢表是另外表的場景
.column().in(queryClass, query-> {對query設置條件})

如果嵌套查詢的不是同表一張表,需要在in方法裡面顯式聲明一下Query對象的class類型, 後面用法同方法一。

@DisplayName("嵌套查詢和主查詢的表是不同")
@Test
void test_in_difference_table_query() {
    UserQuery query = new UserQuery()
        .selectId()
        .where.addressId().in(ReceivingAddressQuery.class, q -> q.selectId()
            .where.id().in(new int[]{1, 2}).end())
        .end();
    mapper.listEntity(query);
    
    // 通過Test4J工具,驗證sql語句
    db.sqlList().wantFirstSql()
        .eq("SELECT id " +
            "FROM user " +
            "WHERE address_id IN (SELECT id FROM receiving_address WHERE id IN (?, ?))");
}

not in嵌套查詢: 使用方法同 in 嵌套查詢

exists (select子查詢)

嵌套查詢表和主查詢表一樣的場景
Exists查詢不需要指定字段,直接在query where中可以引用exists方法。

exists( query-> {對query設置條件})
如果exists查詢的表和主查詢一致,直接在lambada表達式中使用同類型query參數即可,參數用法同in方法。

exists(queryClass, query-> {對query設置條件})
如果exists查詢的表和主查詢不一致,在exists方法第一個參數指定query類型,第二個參數同方法1。

具體示例

@DisplayName("EXISTS查詢")
@Test
void test_exists_query() {
    UserQuery query = new UserQuery()
        .where.exists(ReceivingAddressQuery.class, q -> q
            .where.detailAddress().like("杭州")
            .and.id().apply(" = user.address_id").end())
        .end();
    mapper.listEntity(query);
    
    // 通過Test4J工具,驗證sql語句
    db.sqlList().wantFirstSql()
        .eq("SELECT id, gmt_create, gmt_modified, is_deleted, account, address_id, age, avatar, birthday, bonus_points, e_mail, password, phone, status, user_name " +
                "FROM user " +
                "WHERE EXISTS (SELECT *" +
                "   FROM receiving_address" +
                "   WHERE detail_address LIKE ?" +
                "   AND id = user.address_id)",
            StringMode.SameAsSpace);
}

註:示例中的測試,是使用H2內存數據庫,你可以直接運行,不需要你額外建表。
但使用Test4J執行測試,你需要在加入vm參數:-javaagent:/這裡是你本地maven倉庫地址/org/jmockit/jmockit/1.48/jmockit-1.48.jar

以我本機為例,具體參數如圖:

在這裡插入圖片描述

Fluent Mybatis文檔&示例

Fluent Mybatis源碼, github

到此這篇關於Fluent Mybatis零xml配置實現復雜嵌套查詢的文章就介紹到這瞭,更多相關Fluent Mybatis 復雜嵌套查詢內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: