Fluent Mybatis零xml配置實現(xiàn)復(fù)雜嵌套查詢
嵌套查詢
使用Fluent Mybatis, 不用手寫一行xml文件或者Mapper文件,在dao類中即可使用java api構(gòu)造中比較復(fù)雜的嵌套查詢。
讓dao的代碼邏輯和sql邏輯合二為一。
前置準備,maven工程設(shè)置
參考文章 使用FluentMybatis實現(xiàn)mybatis動態(tài)sql拼裝和fluent api語法
in (select 子查詢)
嵌套查詢表和主查詢表一樣的場景
.column().in( query-> {對query設(shè)置條件})
只需要在in里面引用一個lambda表達式,lambda表達式入?yún)⑹且粋€同名的Query。對這個入?yún)⒖梢栽O(shè)置where參數(shù)。
@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設(shè)置條件})
如果嵌套查詢的不是同表一張表,需要在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設(shè)置條件})
如果exists查詢的表和主查詢一致,直接在lambada表達式中使用同類型query參數(shù)即可,參數(shù)用法同in方法。
exists(queryClass, query-> {對query設(shè)置條件})
如果exists查詢的表和主查詢不一致,在exists方法第一個參數(shù)指定query類型,第二個參數(shù)同方法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內(nèi)存數(shù)據(jù)庫,你可以直接運行,不需要你額外建表。
但使用Test4J執(zhí)行測試,你需要在加入vm參數(shù):-javaagent:/這里是你本地maven倉庫地址/org/jmockit/jmockit/1.48/jmockit-1.48.jar
以我本機為例,具體參數(shù)如圖:
到此這篇關(guān)于Fluent Mybatis零xml配置實現(xiàn)復(fù)雜嵌套查詢的文章就介紹到這了,更多相關(guān)Fluent Mybatis 復(fù)雜嵌套查詢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot 整合 Java DL4J 實現(xiàn)醫(yī)學影像診斷功能介紹
本文介紹如何利用SpringBoot整合Java Deeplearning4j實現(xiàn)醫(yī)學影像診斷功能,重點介紹了卷積神經(jīng)網(wǎng)絡(luò)在處理醫(yī)學影像中的應(yīng)用,以及如何進行數(shù)據(jù)預(yù)處理、模型構(gòu)建、訓練與預(yù)測,提供了詳細的代碼實現(xiàn)和單元測試方法,目的是輔助醫(yī)生更準確快速地進行疾病診斷2024-10-10SpringBoot+ShardingSphereJDBC實現(xiàn)讀寫分離詳情
這篇文章主要介紹了SpringBoot+ShardingSphereJDBC實現(xiàn)讀寫分離詳情,通過用??MySQL??進行一主一從的主從復(fù)制展開全文內(nèi)容,需要的朋友可以參考一下2022-08-08idea2020.3配置maven環(huán)境并配置Tomcat的詳細教程
這篇文章主要介紹了idea2020.3配置maven環(huán)境并配置Tomcat的詳細教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03解析spring-boot-starter-parent簡介
本文通過代碼的形式給大家介紹了spring-boot-starter-parent的基礎(chǔ)知識,需要的朋友可以參考下2018-09-09NoHttpResponseException問題分析解決記錄
這篇文章主要為大家介紹了NoHttpResponseException問題分析解決記錄,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08MultipartFile中transferTo(File file)的路徑問題及解決
這篇文章主要介紹了MultipartFile中transferTo(File file)的路徑問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07Swing圖形界面實現(xiàn)可動態(tài)刷新的驗證碼
這篇文章主要為大家詳細介紹了Swing圖形界面實現(xiàn)可動態(tài)刷新的驗證碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-05-05Java實現(xiàn)簡易版聯(lián)網(wǎng)坦克對戰(zhàn)小游戲(附源碼)
這篇文章主要給大家介紹了關(guān)于Java實現(xiàn)簡易版聯(lián)網(wǎng)坦克對戰(zhàn)小游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用java具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2019-04-04