最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JPA?通過(guò)Specification如何實(shí)現(xiàn)復(fù)雜查詢(xún)

 更新時(shí)間:2021年11月23日 09:29:06   作者:三3三  
這篇文章主要介紹了JPA?通過(guò)Specification如何實(shí)現(xiàn)復(fù)雜查詢(xún),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

JPA 通過(guò)Specification實(shí)現(xiàn)復(fù)雜查詢(xún)

JPA中繼承BaseRepo之后,可以使用最基本的增刪改查,如果想實(shí)現(xiàn)復(fù)雜查詢(xún),則需要借助Specification來(lái)完成這個(gè)功能:

下面就簡(jiǎn)單介紹一下Specification的使用

public void findAll(ConstructPlanPageReqEntity constructPlanPageReqEntity) {
	Integer pageNum = page.getPageNum();
        Integer pageSize = page.getPageSize();
        String costType = constructPlanPageReqEntity.getCostType();
        String name = constructPlanPageReqEntity.getName();
        String planMoneyStart = constructPlanPageReqEntity.getPlanMoneyStart();
        String planMoneyEnd = constructPlanPageReqEntity.getPlanMoneyEnd();
        String singMoneyEnd = constructPlanPageReqEntity.getSingMoneyEnd();
        String signMoneyStart = constructPlanPageReqEntity.getSignMoneyStart();
        long projectId = Long.parseLong(constructPlanPageReqEntity.getProjectId());
        String status = constructPlanPageReqEntity.getStatus();
        //分頁(yè)
        pageNum=pageNum-1;
        Pageable pageable = PageRequest.of(pageNum, pageSize);
//多條件匹配查詢(xún)
        Specification specification= new Specification<ContractPlanBean>() {
            @Override
            public Predicate toPredicate(Root<ContractPlanBean> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                ArrayList<Predicate> list = new ArrayList<>();
                Path<String> costType1 = root.get("costType");
                Path<String> name1 = root.get("name");
                Path<Long> projectId1 = root.get("projectId");
                Path<Object> status1 = root.get("status");
                if (projectId>0){
                    list.add(criteriaBuilder.equal(projectId1,projectId));
                }
                if (StringUtil.isNotEmpty(status)){
                    list.add(criteriaBuilder.equal(status1,status));
                }
                //條件查詢(xún)
                if (StringUtil.isNotEmpty(costType)){
                    list.add(criteriaBuilder.equal(costType1,costType));
                }
                //模糊查詢(xún)
                if (StringUtil.isNotEmpty(name)){
                    list.add(criteriaBuilder.like(name1,"%"+name+"%"));
                }
                //范圍查詢(xún)
                if (StringUtil.isNotEmpty(planMoneyStart)&&StringUtil.isNotEmpty(planMoneyEnd)){
                    try {
                        list.add(criteriaBuilder.between(root.get("planMoney"),NumberUtil.strToDouble(planMoneyStart),NumberUtil.strToDouble(planMoneyEnd)));
                    } catch (Exception e) {
                        throw new ApiException("規(guī)劃金額查詢(xún)失敗");
                    }
                }
                 //排序
                criteriaQuery.orderBy(criteriaBuilder.asc(root.get("name")));
                Predicate[] array = new Predicate[list.size()];
                return criteriaBuilder.and(list.toArray(array));
            }
        };
}

以上代碼實(shí)現(xiàn)了多條件查詢(xún),其中需要重寫(xiě)toPredicate方法,具體參數(shù):

  • 用root.get()獲取bean中的數(shù)據(jù)庫(kù)對(duì)應(yīng)字段
  • 用criteriaBuilder來(lái)組建條件查詢(xún)語(yǔ)句

在這里插入圖片描述

上圖是criteriaBuilder各種sql符號(hào)的方法名,根據(jù)需求組建不同的sql語(yǔ)句

criteriaBuilder.and(list.toArray(array))這句是最后定義各個(gè)sql查詢(xún)條件的關(guān)系,這里用的and

至此,復(fù)雜sql語(yǔ)句就拼接完成,本人對(duì)Specification的使用未進(jìn)行深入研究,個(gè)人覺(jué)得相對(duì)filter Strem的復(fù)雜查詢(xún)來(lái)說(shuō)Specification更繁瑣,因此更傾向于通過(guò)Strem的復(fù)雜查詢(xún),這回就不多說(shuō)了,下次就介紹下如何使用Stream進(jìn)行復(fù)雜查詢(xún)

spring-data-jpa Specification拼接復(fù)雜查詢(xún)

  public Page<ServiceItem> findAll(Map<String, String[]> params, ServiceItemConsumeStatus serviceItemConsumeStatus,ServiceItemStatus serviceItemStatus, Pageable pageable) {
        return dao.findAll(spec(serviceItemConsumeStatus, serviceItemStatus, params), pageable);
    }
    private Specification<ServiceItem> spec(final ServiceItemConsumeStatus serviceItemConsumeStatus, 
    final ServiceItemStatus serviceItemStatus, Map<String, String[]> params) {
        Collection<SearchFilter> filters = SearchFilter.parse(params).values();
        final Specification<ServiceItem> fsp = SearchFilter.spec(filters, ServiceItem.class);
        Specification<ServiceItem> sp = new Specification<ServiceItem>() {
            public Predicate toPredicate(Root<ServiceItem> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                Predicate pred = fsp.toPredicate(root, query, cb);
                if (ServiceItemConsumeStatus.可消費(fèi).equals(serviceItemConsumeStatus)) {
                    pred = cb.and(pred, cb.gt(root.get("countLeft").as(int.class), 0));
                } else if (ServiceItemConsumeStatus.消費(fèi)完畢.equals(serviceItemConsumeStatus)) {
                    pred = cb.and(pred, cb.le(root.get("countLeft").as(int.class), 0));
                }
                if (serviceItemStatus != null) {
                    pred = cb.and(pred, cb.equal(root.get("status"), serviceItemStatus));
                }
                return pred;
            }
        };
        return sp;
    }

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中HashSet集合元素去重的操作代碼

    Java中HashSet集合元素去重的操作代碼

    在 Java 編程的廣闊天地里,集合框架是開(kāi)發(fā)者們不可或缺的得力工具,其中,HashSet以其獨(dú)特的去重特性,成為處理不重復(fù)元素場(chǎng)景的首選,今天,咱們就深入探究一下HashSet集合元素的去重操作,需要的朋友可以參考下
    2025-03-03
  • Java集合的定義與Collection類(lèi)使用詳解

    Java集合的定義與Collection類(lèi)使用詳解

    這篇文章主要介紹了Java集合的定義及Collection工具類(lèi)使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-11-11
  • Android、iOS和Java通用的AES128加密解密示例代碼

    Android、iOS和Java通用的AES128加密解密示例代碼

    現(xiàn)在很多App在與服務(wù)器接口的請(qǐng)求和響應(yīng)過(guò)程中,為了安全都會(huì)涉及到加密和解密的問(wèn)題,如果不加的話(huà)就會(huì)是明文的,即使加了GZIP也可以被直接解壓成明文。如果同時(shí)有Android和IOS的App的話(huà)、必須要保證加密和解密的算法一致、不然后臺(tái)沒(méi)法處理,下面通過(guò)這篇文章學(xué)習(xí)下。
    2016-11-11
  • selenium高效應(yīng)對(duì)Web頁(yè)面元素刷新的實(shí)例講解

    selenium高效應(yīng)對(duì)Web頁(yè)面元素刷新的實(shí)例講解

    今天小編就為大家分享一篇selenium高效應(yīng)對(duì)Web頁(yè)面元素刷新的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • Java正則表達(dá)式之Pattern和Matcher的使用

    Java正則表達(dá)式之Pattern和Matcher的使用

    本文詳細(xì)介紹了Java中處理正則表達(dá)式的Pattern和Matcher類(lèi)的使用方法和實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • js判斷是否含有GBK以外的字符的函數(shù)

    js判斷是否含有GBK以外的字符的函數(shù)

    判斷是否含有GBK以外的特殊字符
    2008-10-10
  • springboot restTemplate連接池整合方式

    springboot restTemplate連接池整合方式

    這篇文章主要介紹了springboot restTemplate連接池整合方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • SpringBoot 集成 Druid過(guò)程解析

    SpringBoot 集成 Druid過(guò)程解析

    這篇文章主要介紹了SpringBoot 集成 Druid過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • jmeter+ant+jenkins自動(dòng)化測(cè)試環(huán)境配置搭建過(guò)程

    jmeter+ant+jenkins自動(dòng)化測(cè)試環(huán)境配置搭建過(guò)程

    在搭建jmeter+ant+jenkins環(huán)境有些前提條件,那就是要先配置好java環(huán)境、安裝好jenkins以及配置好jmeter,這樣才能省去很多的事情,對(duì)jmeter+ant+jenkins自動(dòng)化測(cè)試環(huán)境配置搭建過(guò)程感興趣的朋友一起看看吧
    2021-12-12
  • 你知道將Bean交給Spring容器管理有幾種方式(推薦)

    你知道將Bean交給Spring容器管理有幾種方式(推薦)

    Spring核心是?IOC?和?AOP?,我們?cè)赟pring項(xiàng)目中,我們需要將Bean交給Spring容器,也就是IOC管理,這樣你才可以使用注解來(lái)進(jìn)行依賴(lài)注入,這篇文章主要介紹了你知道將Bean交給Spring容器管理有幾種方式,需要的朋友可以參考下
    2022-10-10

最新評(píng)論

津市市| 黎平县| 日照市| 泾川县| 景泰县| 延吉市| 孝义市| 剑河县| 武邑县| 高州市| 偏关县| 花垣县| 庆云县| 芜湖县| 老河口市| 永德县| 宝清县| 马龙县| 绥中县| 湖北省| 昌黎县| 姜堰市| 上蔡县| 海丰县| 垫江县| 崇阳县| 弥渡县| 沅江市| 四平市| 历史| 襄汾县| 贺州市| 确山县| 巩留县| 文山县| 陵川县| 平塘县| 海门市| 城步| 孝感市| 峨眉山市|