• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • spring data jpa 動態分頁查詢多表多條件復雜查詢實現

    標簽: Spring  Data  JPA

    本篇文章重點解決通過jpa實現動態分頁多表復雜查詢的實現

    公司現在用的spring data jpa作為后臺運營框架 ,通過下圖jpa封裝的這五個方法雖然就可以實現動態分頁查詢,(關于這個接口的使用網上一大堆,這里就不再贅述了),但是如果不重寫Specification中的toPredicate方法(重寫toPredicate方法還要按照他的規則用代碼拼接sql,太麻煩…)僅僅可以實現單表的查詢
    jpa封裝的動態分頁查詢方法
    如果需求里要求的返回結果中某些字段是其他表的一些數據那么可以這樣實現:直接貼代碼
    Controller:

    @RequestMapping(value = { "/list" })
        @ResponseBody
        public Page list() {
            SimpleSpecificationBuilder<FamilyEntity> builder = new SimpleSpecificationBuilder<FamilyEntity>();
            String searchText = request.getParameter("searchText");
            if(StringUtils.isNotBlank(searchText)){
                builder.add("familyName", SpecificationOperator.Operator.likeAll.name(), searchText);
                builder.addOr("characterId", SpecificationOperator.Operator.likeAll.name(), searchText);
                builder.addOr("leaderName", SpecificationOperator.Operator.likeAll.name(), searchText);
            }
            List<FamilyEntity> all = familyService.findAll(builder.generateSpecification());
            PageRequest pageRequest = getPageRequest();
            List<Map> list = familyService.findPageList(all);
            Page<Map> page = ListPageUtil.listConvertToPage(list, pageRequest);
            return page;
        }
    

    實現思路:
    1:首先通過familyService.findAll方法根據查詢條件查詢出主表是數據
    (這里的findAll方法其實就是JpaSpecificationExecutor中(圖1)的findall方法的一個封裝,builder對象是其他人封裝好的,可以通過它的add方法添加查詢條件的對象,如前端根據familyname ,leaderName進行動態查詢)
    2:再將list all 作為參數去拼接我們想要的最終List

    public List<Map> findPageList(List<FamilyEntity> list) {
            List<Map> reList = new ArrayList();
            for(FamilyEntity entity:list){
                Map<String, Object> map = new HashMap();
                map.put("characterId", entity.getCharacterId());
                map.put("familyName",  entity.getFamilyName());
                map.put("album",  entity.getAlbum());
                map.put("leaderId",entity.getLeaderId());
                map.put("leaderName", entity.getLeaderName());
                Float sumPea  = incomeRepo.getSumWorth(entity.getId());
                if(sumPea==null){ map.put("sumPea", 0);}else{map.put("sumPea", sumPea);}
                reList.add(map);
            }
            return reList;
        }
    

    其中sumpea這個數據是從另外一張income表中查出的數據(這里可以根據需求去任意查詢其他表的數據,如果業務邏輯sql復雜的話大不了使用@Query注解就好),最后將這兩張表的數據重新封裝成一個reList返回給controller
    3:最后我們需要將這個返回的list進行分頁處理返回給前臺也就是
    Page<Map> page = ListPageUtil.listConvertToPage(list, pageRequest);最后這行代碼

    public class ListPageUtil<T> {
    
        public static  <T> Page<T> listConvertToPage(List<T> list, Pageable pageable) {
            // 當前頁第一條數據在List中的位置
            int start = (int)pageable.getOffset();
            // 當前頁最后一條數據在List中的位置
            int end = (start + pageable.getPageSize()) > list.size() ? list.size() : ( start + pageable.getPageSize());
            // 配置分頁數據
            return new PageImpl<T>(list.subList(start, end), pageable, list.size());
        }
    
    }
    

    這里使用了jpa的PageImpl方法將list轉為page ,根據網上資料
    https://www.jb51.net/article/157182.htm
    jpa不會自己按照傳入的參數分割List所以我們list入參需要手動分割一下

    總結思路就是先通過jpa封裝的動態查詢主表數據, 再將主表數據和其他表數據自由拼接為一個list,最后通過將list轉為page將數據分頁返回給前端

    版權聲明:本文為zhashuo7113原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/zhashuo7113/article/details/102697786

    智能推薦

    Spring Data JPA QueryDSL 多表聯合查詢

    很多時候表與表之間是有關系的,比如一對一 一對多等等,也有的沒有建立起 關系只是存了主鍵id 。 此時多表查詢可以使用left join 代碼如下: 執行的sql: 然后看下集合中的值:  ...

    Spring-Data-Jpa條件查詢

    Spring-Data-Jpa條件查詢 按照SpringData的規則,可以通過定義在Repository接口下的方法名稱來執行查詢等操作,查詢的方法名稱必須以find、get、read、開頭,同時,涉及條件查詢時,SpringDataJpa支持將條件屬性定義在數據訪問層接口下的方法名稱中,條件屬性通過條件關鍵字鏈接。需要注意的是:條件屬性的首字母必須大寫,下面來看一個案例吧。 1、創建一個spr...

    Spring Data JPA之動態查詢

    在日常工作中,Spring Data JPA的使用給我們帶來了極大的方便,但是實際業務中很多場景需要支持動態查詢。比如前端查詢功能提供了很多查詢條件,用戶可以根據一部分條件進行查詢,那么后端就需要支持可配置的查詢服務。在使用mybatis等時,可以用動態查詢的方式輕松搞定,但是對于初次使用Spring Data JPA的小白來說,著實有些困難。本人也是在實際工作中參考資料,一步步摸索,掌握了一定的...

    Spring Data JPA全動態查詢實現過程

    在開發時,我們常常需要認識到——一個技術在某些需求下表現良好,必然在其他需求下表現的不盡人意,這便是我們常說的“沒有銀彈”。 不過我可以在了解這項技術的實現原理的基礎上,做出一些改造。   我們面對的需求是:提供前端一個類似于 GraphQL 的,具有高度定制化特性的一個查詢接口 我們面對的問題是:Spring Data JPA 在動態查詢...

    Unity_Shader高級篇_13.1_Unity Shader入門精要

    13.4 再談邊緣檢測 在12.3中,我們曾使用Sobel算子對屏幕圖像進行邊緣測試,實現描邊的效果。但是,這種直接利用顏色信息進行邊緣檢測的方法會產生很對我們不希望得到的邊緣線,如圖13.8所示。 可以看出,物體的紋理、陰影等位置也被描上黑邊,而這往往不是我們希望看到的。在本節中,我們將學習如何在深度和法線上進行邊緣檢測,這些圖像不會受紋理和光照的影響,而僅僅保存了當前渲染物體的模型信息,通過這...

    猜你喜歡

    Seata AT 模式 原理詳解

    目錄 前提 整體機制 寫隔離 讀隔離 工作機制 一階段 二階段-回滾 二階段-提交 附錄 回滾日志表 前提 基于支持本地 ACID 事務的關系型數據庫。 Java 應用,通過 JDBC 訪問數據庫。 整體機制 兩階段提交協議的演變: 一階段:業務數據和回滾日志記錄在同一個本地事務中提交,釋放本地鎖和連接資源。 二階段: 提交異步化,非常快速地完成。 回滾通過一階段的回滾日志進行反向補償。 寫隔離 ...

    Python爬蟲 | 滑動驗證碼**

    極驗驗證碼:需要手動拼合滑塊來完成的驗證,相對圖形驗證碼識別難度上升了幾個等級。下面用程序識別并通過極驗驗證碼的驗證,其中有分析識別思路、識別缺口位置、生成滑塊拖動、模擬實現滑塊拼合通過驗證等步驟。需要用到Chrome 瀏覽器,并配置 ChromeDriver ,要用到的 Python 庫是 Selenium。 1、 對極驗驗證碼了解   極驗驗證碼官網:http://www.geetest.co...

    MobaXterm root用戶連接虛擬機時出現Access denied

    1.linux打開ssh服務 2.新建連接 首先在romote host中填入要連接的主機ip specify username中填入連接的用戶名 port為連接端口默認為22 輸入連接用戶的密碼 linux默認不顯示密碼 發現密碼正確但是連接不上 問題解決 /etc/ssh/sshd_config 配置問題: #PermitRootLogin prohibit-password將該行改為Perm...

    Linux C 預處理命令

    預處理命令 一、宏定義 C語言標準允許在程序中用一個標識符來表示一個字符串,成為宏。標識符為宏名 ,在編譯預處理時,將程序中所有的宏名用相應的字符串來替換,這個過程稱為宏替換,宏分為兩種:無參數的宏和有參數的宏。 1.無參數的宏 無參數宏定義的一般形式為:#define 標識符字符串 “#”代表本行是編譯預處理命令。define是宏定義的關鍵詞,標識符是宏名。字符串是宏名所...

    有意思的算法(一)----冒泡排序

        冒泡排序的基本思想是:每次比較兩個相鄰的元素,如果它們的順序錯誤就把他們交換過來。     下面舉一個具體的例子來介紹一下冒泡排序。     有12,35,99,18,76五個數進行從大到小的排序,既然是從大到小排序,也就是說越小的越靠后,可不要把這句當成廢話,這可是最關...

    精品国产乱码久久久久久蜜桃不卡