溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringDataJpa怎么使用union多表分頁條件查詢

發布時間:2022-02-24 18:52:40 來源:億速云 閱讀:630 作者:iii 欄目:開發技術

本篇內容介紹了“SpringDataJpa怎么使用union多表分頁條件查詢”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

    如何使用union多表分頁條件查詢

    當前項目有一個全局搜索的功能,需要涉及到7-8張主表,由于當前項目使用的是Jpa,所以我決定使用原生sql的方式使用union來進行查詢,由于對這個框架的不熟悉,被坑了很久,特此記錄。

    條件

    1、在參數列表中,使用@Param注解(例:@Param(“userId”) Long userId)

    2、在sql中應該以 :userId 的方式來注入參數(例:person.user_id = :userId),或者用?1 ?2根據參數的順序來注入也可以,我采用的是第一種

    3、sql應該是寫在@Query的value中,并且設置 nativeQuery = true

    4、如果要設置一個可能為空的值,比如:有一個分類,需要當作條件查詢,但是這個值是可能為空的,所以需要在sql中判斷,如果為空就不進行篩選。語法其實和在sql中判斷是一樣的

    where IF(:category is not null,a.category = :category is not null,1=1)

    分頁

    1、分頁必須加countQuery這個參數,把上面sql價格count就可以

    2、傳入Pageable,不要傳sort,不然會報錯,暫時沒找到解決方案

    例如 select * from a 為你的sql

    那么分頁應該是

    select * from (select * from a) b order by ?#{#pageable}

    order by在countQuery里面就不用加了哦

    3、返回的是Page<Object[]>,里面content封裝的順序就是你sql查出來的順序

    踩過的坑

    1、多表union查詢,查詢的字段應該是一樣的,比如第一張user表查詢id,name,sex、第二張address表也必須查詢id,name,sex,如果沒有這個字段則自己封裝返回固定的值,可以為空字符串

    2、傳入pageable的時候 ?#{#pageable} 必須這樣寫

    分享幾個用到的mysql語法

    1、判斷是否為空,不為空查詢時間在傳入時間之間的數據

    IF(:startTime is not null and :endTime is not null,proc.create_time between :startTime and :endTime,1=1)

    這邊我在service是判斷了結束時間是否為空的,如果結束時間為空,開始時間不為空默認查詢一年的數據

    2、根據名稱模糊查詢

    proc.content LIKE CONCAT('%',:content,'%')

    3、最后根據查出來的總數據對類型篩選

    IF(:category is not null,a.category = :category is not null,1=1)

    小結一下:

    1、其實很簡單的分頁條件查詢,因為不熟悉jpa的語法,導致浪費了很多時間,希望可以幫到更多的人。

    2、暫時不知道怎么排序,無論是在pageable中傳入sort,還是在sql最后進行排序都會報錯,如果有大佬知道的話可以點撥一下。

    jpa執行原生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 ='愛奇藝' 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前面需要連接一個空數據查詢,因為union 第一個查詢不能用()

    “SpringDataJpa怎么使用union多表分頁條件查詢”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女