SpringDataJpa如何使用union多表分頁(yè)條件查詢
如何使用union多表分頁(yè)條件查詢
當(dāng)前項(xiàng)目有一個(gè)全局搜索的功能,需要涉及到7-8張主表,由于當(dāng)前項(xiàng)目使用的是Jpa,所以我決定使用原生sql的方式使用union來(lái)進(jìn)行查詢,由于對(duì)這個(gè)框架的不熟悉,被坑了很久,特此記錄。
條件
1、在參數(shù)列表中,使用@Param注解(例:@Param(“userId”) Long userId)
2、在sql中應(yīng)該以 :userId 的方式來(lái)注入?yún)?shù)(例:person.user_id = :userId),或者用?1 ?2根據(jù)參數(shù)的順序來(lái)注入也可以,我采用的是第一種
3、sql應(yīng)該是寫在@Query的value中,并且設(shè)置 nativeQuery = true
4、如果要設(shè)置一個(gè)可能為空的值,比如:有一個(gè)分類,需要當(dāng)作條件查詢,但是這個(gè)值是可能為空的,所以需要在sql中判斷,如果為空就不進(jìn)行篩選。語(yǔ)法其實(shí)和在sql中判斷是一樣的
where IF(:category is not null,a.category = :category is not null,1=1)
分頁(yè)
1、分頁(yè)必須加countQuery這個(gè)參數(shù),把上面sql價(jià)格count就可以
2、傳入Pageable,不要傳sort,不然會(huì)報(bào)錯(cuò),暫時(shí)沒(méi)找到解決方案
例如 select * from a 為你的sql
那么分頁(yè)應(yīng)該是
select * from (select * from a) b order by ?#{#pageable}order by在countQuery里面就不用加了哦
3、返回的是Page<Object[]>,里面content封裝的順序就是你sql查出來(lái)的順序
踩過(guò)的坑
1、多表union查詢,查詢的字段應(yīng)該是一樣的,比如第一張user表查詢id,name,sex、第二張address表也必須查詢id,name,sex,如果沒(méi)有這個(gè)字段則自己封裝返回固定的值,可以為空字符串
2、傳入pageable的時(shí)候 ?#{#pageable} 必須這樣寫
分享幾個(gè)用到的mysql語(yǔ)法
1、判斷是否為空,不為空查詢時(shí)間在傳入時(shí)間之間的數(shù)據(jù)
IF(:startTime is not null and :endTime is not null,proc.create_time between :startTime and :endTime,1=1)
這邊我在service是判斷了結(jié)束時(shí)間是否為空的,如果結(jié)束時(shí)間為空,開始時(shí)間不為空默認(rèn)查詢一年的數(shù)據(jù)
2、根據(jù)名稱模糊查詢
proc.content LIKE CONCAT('%',:content,'%')3、最后根據(jù)查出來(lái)的總數(shù)據(jù)對(duì)類型篩選
IF(:category is not null,a.category = :category is not null,1=1)
小結(jié)一下:
1、其實(shí)很簡(jiǎn)單的分頁(yè)條件查詢,因?yàn)椴皇煜pa的語(yǔ)法,導(dǎo)致浪費(fèi)了很多時(shí)間,希望可以幫到更多的人。
2、暫時(shí)不知道怎么排序,無(wú)論是在pageable中傳入sort,還是在sql最后進(jìn)行排序都會(huì)報(bào)錯(cuò),如果有大佬知道的話可以點(diǎn)撥一下。
jpa執(zhí)行原生sql union bug解決
@Query(value = "SELECT * FROM count_entity where id=-1111 union (SELECT * FROM count_entity where video_name = ?1 AND platform ='騰訊視頻' ORDER BY click_date DESC LIMIT ?2)" ?+ "UNION" ?+ "(SELECT * FROM count_entity where video_name = ?1 AND platform ='愛(ài)奇藝' ORDER BY click_date DESC LIMIT ?2)" ?+ "UNION" ?+ "(SELECT * FROM count_entity where video_name = ?1 AND platform ='芒果TV' ORDER BY click_date DESC LIMIT ?2)", nativeQuery = true)
union前面需要連接一個(gè)空數(shù)據(jù)查詢,因?yàn)閡nion 第一個(gè)查詢不能用()
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- SpringData JPA快速上手之關(guān)聯(lián)查詢及JPQL語(yǔ)句書寫詳解
- SpringData JPA中查詢接口Repository的使用
- SpringDataJpa like查詢無(wú)效的解決
- SpringDataJPA之Specification復(fù)雜查詢實(shí)戰(zhàn)
- springdata jpa使用Example快速實(shí)現(xiàn)動(dòng)態(tài)查詢功能
- SpringDataJPA原生sql查詢方式的封裝操作
- SpringData JPA實(shí)現(xiàn)查詢分頁(yè)demo
- SpringData JPA Mongodb查詢部分字段問(wèn)題
相關(guān)文章
SpringBoot中發(fā)送QQ郵件功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了SpringBoot中發(fā)送QQ郵件功能的實(shí)現(xiàn)代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02
java調(diào)用python代碼的兩種實(shí)現(xiàn)方式:Runtime.exec()和Jython
在Java中調(diào)用Python代碼有多種方法,包括使用Runtime.exec()和第三方庫(kù)如Jython,Runtime.exec()通過(guò)系統(tǒng)命令執(zhí)行Python腳本,適用于簡(jiǎn)單的調(diào)用場(chǎng)景,Jython則是一個(gè)Python的Java實(shí)現(xiàn),允許在Java中直接運(yùn)行Python代碼,適用于更深層次的集成需求2025-01-01
Java即將引入新對(duì)象類型來(lái)解決內(nèi)存使用問(wèn)題
這篇文章主要介紹了Java即將引入新對(duì)象類型來(lái)解決內(nèi)存使用問(wèn)題,文章通過(guò)圍繞主題的相關(guān)資料展開詳細(xì)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05
Java中YYYY-MM-dd與yyyy-MM-dd的區(qū)別及跨年問(wèn)題
YYYY-MM-dd可能會(huì)導(dǎo)致跨年周的日期被歸屬到錯(cuò)誤的年份, yyyy-MM-dd總是表示實(shí)際的日歷年份,無(wú)論日期所在的周是否跨年,本文就來(lái)介紹一下兩者的區(qū)別,感興趣的可以了解一下2024-01-01
Java多線程 Callable、Future 和FutureTask
這篇文章主要介紹Java多線程中的 Callable、Future 以及FutureTask,下面文章圍繞Java多線程的相關(guān)資料展開全文詳細(xì)內(nèi)容,需要的朋友可以參考一下2021-10-10
在controller中如何設(shè)置接收參數(shù)的默認(rèn)值
這篇文章主要介紹了在controller中如何設(shè)置接收參數(shù)的默認(rèn)值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03

