一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 聊聊Spring data jpa @query使用原生SQl,需要注意的坑

聊聊Spring data jpa @query使用原生SQl,需要注意的坑

2021-12-08 11:01湫兮若風 Java教程

這篇文章主要介紹了Spring data jpa@query使用原生SQl,需要注意的坑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

Spring data jpa @Query 使用原生Sql的坑

根據代碼來解說:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
@Query(value = "select bill.id_ as id, bill.created_date as date, bill.no, lawyer_case .case_no as caseNo, " +
            "lawyer_case .case_name as caseName, customer.no as customerNo, customer.cn_name as customerName, " +
            "bill.total_expense_after_tax, bill.collected_money, bill.book_ticket_amount, bill.version " +
            "e1.name as creator, bill.status" +
            "from bill " +
            "left join lawyer_case on lawyer_case .case_no=bill.case_no " +
            "left join customer on customer.no=bill.customer_no " +
            "left join employee e1 on e1.id_=bill.creator " +
            "where IF (?1!='', customer_no=?1, 1=1) " +
            "and   IF (?2!='', case_no=?2, 1=1) " +
            "and   IF (?3!='', status=?3, 1=1) " +
            "and   IF (?4!='', creator'%',?4,'%')), 1=1) " +
            "and   create_by=?5 " +
            "ORDER BY ?#{#pageable} ",
            countQuery = "select count(*) " +
                    "from bill " +
                    "left join lawyer_case on lawyer_case .case_no=bill.case_no " +
                    "left join customer on customer.no=bill.customer_no " +
                    "left join employee e1 on e1.id_=bill.creator " +
                    "where IF (?1!='', customer_no=?1, 1=1) " +
                    "and   IF (?2!='', case_no=?2, 1=1) " +
                    "and   IF (?3!='', status=?3, 1=1) " +
                    "and   IF (?4!='', creator'%',?4,'%')), 1=1) " +
                    "and   create_by=?5 "+
                    "ORDER BY ?#{#pageable} ",
            nativeQuery = true)
    Page<Object[]> findAllBill(String customerNo, String caseNo, Integer status, String creator,
                               String createBy, Pageable pageable);

需要注意的方法有以下幾點

  • 1、From 不支持重命名.
  • 2、返回的是一個page<Object[]>,數組中只保存了數據,沒有對應的key,只能根據返回數據的順序,依次注入到DTO中。
  • 3、對于使用分頁,需要:“ORDER BY ?#{#pageable}”,可以直接傳入一個pageable對象,會自動解析。
  • 4、注意格式問題,很多時候就是換行的時候,沒有空格。
  • 5、仔細對應數據庫中表字段,很多時候報某個字段找不到,就是因為字段名寫錯,和數據庫中對應不上。
  • 6、這是解決使用微服務,大量的數據都需要遠程調用,會降低程序的性能。
  • 7、使用Pageabel作為參數的時候,去進行分頁。剛開始的時候,覺得還是一個可行的辦法,但是得注意的時候,當需要排序的時候,是無法加入sort字段的。 會一直報錯left*。
  • 8、針對7的解決方案,把原生SQL的數據查詢和countQuery分成兩個查詢方法。得到count,然后進行判斷,若是等于0,則直接返回空集合;反之,則取獲取數據。 需要自己進行分頁計算,傳入正確的pageNumber和pageSize。

大部分系統都是按照修改時間進行降序排序。 所以,order by可以寫死。然后pageNumber和pageSize動態傳入。

pageNumber的算法= (pageNumber - 1) * pageSize, 前提是PageNumber是從1開始,若0,則pageNumber=pageNumber * PageSize; 這樣就可以保證數據的正確。

?
1
2
3
4
5
6
7
8
9
/**
* pageInfos: 轉換之后的數據。
* pageable:傳入的pageable.
* totalPage: 第一條SQL算好的返回值。
* 這樣就可以統一的返回各種pageDTO。
*/
private Page<T> convertForPage(List<T> pageInfos, Pageable pageable, Integer totalPage) {
        return new PageImpl<>(pageInfos, pageable, totalPage);
    }

SpringData JPA @Query動態SQL語句

這次有個需求,需要動態的sql語句去查詢,但是@Query正常情況下SQL語句是寫死的,在查找了很多資料后,想到了一個好的解決辦法

思路

利用MYSQL的判斷來拼接SQL語句

實現

先上代碼

?
1
2
@Query(value = "select * from project_demand where project_id=?1 and if(?2!='',demand_id in (select demand_id from demand_user where user_id=?2),1=1)",nativeQuery = true)
List<ProjectDemand> getListByUser(String projectId,String userId);

聊聊Spring data jpa @query使用原生SQl,需要注意的坑

紅色部分,就是生成動態SQL的方法,利用MYSQL的if函數和我們傳遞的參數去進行判斷,然后獲取SQL語句。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/weixin_38608626/article/details/83183556

延伸 · 閱讀

精彩推薦
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
主站蜘蛛池模板: 亚洲天堂2016 | 桃乃木香奈作品在线观看 | 美女把小内内脱个精光打屁屁 | 被强迫调教的高辣小说 | 日本无吗免费一二区 | 天天操精品 | bdsm中国精品调教 | 久久精品国产在热亚洲完整版 | 精品视频一区二区观看 | 无人区1免费完整观看 | 香蕉91视频 | 日韩欧美精品一区二区 | 青青草99热这里都是精品 | 青青青国产精品国产精品久久久久 | 亚洲AV永久无码精品老司机蜜桃 | 洗濯屋H纯肉动漫在线观看 武侠艳妇屈辱的张开双腿 午夜在线观看免费观看 视频 | a级片欧美 | 校花被扒开尿口折磨憋尿 | 午夜福利理论片在线播放 | 鸭子玩富婆流白浆视频 | 欧美va在线播放免费观看 | 无人区免费一二三四乱码 | 99在线精品日韩一区免费国产 | 精品久久久久久 | 欧美精品一区二区三区免费 | 精品无码久久久久久久动漫 | 国产精品手机视频一区二区 | 玩乳h文奶水和尚 | 亚洲AV久久无码精品蜜桃 | 国产精品露脸国语对白99 | 欧美日韩亚洲成人 | 亚洲日韩精品欧美一区二区 | 我要看免费毛片 | 久久国产精品永久免费网站 | 热99在线视频 | 脱jk裙的美女露小内内无遮挡 | 亚洲高清无码在线 视频 | 99小视频 | 亚洲欧美国产精品久久久 | 人人人人人看碰人人免费 | 亚洲AV永久无码精品澳门 |