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

在JPA中criteriabuilder使用or拼接多個like語句

 更新時間:2021年12月17日 09:00:18   作者:藍色格子  
這篇文章主要介紹了在JPA中criteriabuilder使用or拼接多個like語句,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

criteriabuilder使用or拼接多個like語句

項目中有兩張表,一張角色和機構(gòu)的關(guān)系表role_work_site_relation,存放的是機構(gòu)的id和角色的id,另一張表member_info表中存放用戶相關(guān)信息。

機構(gòu)為樹形結(jié)構(gòu),role_work_site_relation中存放的是當前角色中的所有機構(gòu)id。

查詢member_info時需要根據(jù)role_work_site_relation查詢到有權(quán)限的相應(yīng)機構(gòu)下的數(shù)據(jù)。

而member_info中存放的機構(gòu)id是包含其父級機構(gòu)的。需要再查詢時,首先查出所有的最低一級機構(gòu),再根據(jù)id到用戶表中模糊匹配,中間需要用or拼接。

sql語句類似于

SELECT * FROM member_info WHERE 得了= 0 AND ( memberinfo0_.ORG_IDS LIKE ? OR memberinfo0_.ORG_IDS LIKE ?..)

sql語句如下

 //查詢工地  搜索框有內(nèi)容時
 if (!StrUtil.isEmptyIfStr(conditions.get("orgIds"))){
         predicate1.getExpressions().add(criteriaBuilder.equal(root.get("orgIds"), conditions.get("orgIds")));
 //  搜索框沒有內(nèi)容時,查詢是當前角色下的機構(gòu)       
  }else {
        //以or拼接工地的id集合
        if (bottomLevelDataPermission.size() > 0){
            List predicateList = new ArrayList();
            Predicate [] p = new Predicate[bottomLevelDataPermission.size()];
            for (String dataPermission : bottomLevelDataPermission) {
                predicateList.add(criteriaBuilder.like(root.get("orgIds"),"%" + dataPermission));
            }
            predicateList.toArray(p);
            predicate1.getExpressions().add(criteriaBuilder.or(p));
        }
    }
 //根據(jù)工地id查詢用戶相關(guān)信息
  if (!StrUtil.isEmptyIfStr(conditions.get("workSite"))) {
        predicate.getExpressions().add(criteriaBuilder.equal(root.join("workSite").get("id"),conditions.get("workSite")));
    }

java-jpa-criteriabuilder使用

一個復(fù)雜的查詢例子

包含常用的所有查詢方法

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();     //查詢結(jié)果所需要的類型(Entity相對應(yīng))
        CriteriaQuery<Entity> criteriaQuery = criteriaBuilder.createQuery(Entity.class);     //查詢所需要的主體類(Entity0相對應(yīng))
        Root<Entity0> root = criteriaQuery.from(Entity0.class);     //查詢結(jié)果-select(此處查詢所有符合條件的主體類)
        criteriaQuery.select(root);     //過濾條件用Predicate方法拼接
        Predicate restrictions = criteriaBuilder.conjunction();     //過濾條件——equal(當Entity0關(guān)聯(lián)member類時,Entity0:member=m:1)
        restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.equal(root.get("member"), member));
        //過濾條件——like
        restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.like(root.<String>get("str"), "%"+str+"%"));
        //用戶名查詢(member里面的username匹配) ———— 多層查詢 ———— 子查詢的一種:適用于m:1或1:1(即多對一或一對一)
        restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.like(root.get("member").<String>get("username"), "%"+username+"%"));
        //子查詢(規(guī)范寫法,先判斷查詢內(nèi)容是否存在)(適用于1:m)(即一對多)
        if (searchType != null || searchValue != null || hasExpired != null || status != null || type != null || isPendingReceive != null || isPendingRefunds != null || isAllocatedStock != null || businessType != null) {
            //建立子查詢        Subquery<Order> orderSubquery = criteriaQuery.subquery(Order.class);
            Root<Order> orderSubqueryRoot = orderSubquery.from(Order.class);
            orderSubquery.select(orderSubqueryRoot);       //子查詢和父查詢相關(guān)聯(lián)
            Predicate orderRestrictions = criteriaBuilder.equal(orderSubqueryRoot.<MergeOrder>get("mergeOrder"), root);
            //子查詢過濾條件拼接
            if (searchType != null && searchValue != null) {if ("phone".equals(searchType)) {
                    orderRestrictions = criteriaBuilder.and(orderRestrictions, criteriaBuilder.like(orderSubqueryRoot.<String>get("phone"), "%"+searchValue+"%"));
                }
            }if (type != null) {
                CriteriaBuilder.In<Order.Type> in = criteriaBuilder.in(orderSubqueryRoot.<Order.Type>get("type"));
                in.value(type);
                orderRestrictions = criteriaBuilder.and(orderRestrictions, in);
            }
            //and、or以及判斷是否為null,比較(>)的使用(比較可以用于日期比較)
            if (hasExpired != null) {
                orderRestrictions = criteriaBuilder.and(orderRestrictions, criteriaBuilder.or(orderSubqueryRoot.get("expire").isNull(), criteriaBuilder.greaterThan(orderSubqueryRoot.<Date>get("expire"), new Date())));
            }
            // not的使用方法(不符合上述過濾條件),notEqual的使用,<(小于)的使用
            if (isPendingReceive != null) {
                restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.equal(root.get("paymentMethodType"), PaymentMethod.Type.cashOnDelivery));
                Predicate predicate = criteriaBuilder.and(criteriaBuilder.or(orderSubqueryRoot.get("expire").isNull()
                        , criteriaBuilder.greaterThan(orderSubqueryRoot.<Date>get("expire"), new Date()))
                        , criteriaBuilder.notEqual(orderSubqueryRoot.get("status"), Order.Status.completed)
                        , criteriaBuilder.lessThan(orderSubqueryRoot.<BigDecimal>get("amountPaid"), orderSubqueryRoot.<BigDecimal>get("amount")));
                if (isPendingReceive) {
                    orderRestrictions = criteriaBuilder.and(orderRestrictions, criteriaBuilder.not(predicate));
                }
            }// 多層查詢使用if (businessType != null) {
                orderRestrictions = criteriaBuilder.and(orderRestrictions, criteriaBuilder.equal(orderSubqueryRoot.get("store").get("business").get("businessType"), businessType));
            }       // 拼接過濾條件
            orderSubquery.where(orderRestrictions);
            // 和總條件拼接(exists的使用)
            restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.exists(orderSubquery));
        }
        criteriaQuery.where(restrictions);     TypedQuery<Entity> query = entityManager.createQuery(criteriaQuery);     Entity singleResult = query.getSingleResult();

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

相關(guān)文章

  • MyBatis-Plus使用sl4j日志打印SQL的代碼詳解

    MyBatis-Plus使用sl4j日志打印SQL的代碼詳解

    以下是關(guān)于使用 Spring Boot 起始器替換 slf4j-api 和 logback 依賴的詳細步驟和注意事項,包括 MyBatis-Plus 的默認日志級別信息,需要的朋友可以參考下
    2024-10-10
  • 全面理解Java類和對象

    全面理解Java類和對象

    下面小編就為大家?guī)硪黄胬斫釰ava類和對象。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • Java中的Optional類用法詳細講解

    Java中的Optional類用法詳細講解

    這篇文章詳細介紹了Java中Optional類的使用,包括創(chuàng)建Optional對象,Optional對象的常用方法,如get、orElse、orElseGet、orElseThrow等,以及Optional類結(jié)合Lambda表達式和StreamAPI的使用,需要的朋友可以參考下
    2024-10-10
  • Java畢業(yè)設(shè)計實戰(zhàn)之二手書商城系統(tǒng)的實現(xiàn)

    Java畢業(yè)設(shè)計實戰(zhàn)之二手書商城系統(tǒng)的實現(xiàn)

    這是一個使用了java+JSP+Springboot+maven+mysql+ThymeLeaf+FTP開發(fā)的二手書商城系統(tǒng),是一個畢業(yè)設(shè)計的實戰(zhàn)練習(xí),具有在線書城該有的所有功能,感興趣的朋友快來看看吧
    2022-01-01
  • 一文詳細解析Java?8?Stream?API中的flatMap方法

    一文詳細解析Java?8?Stream?API中的flatMap方法

    這篇文章主要介紹了Java?8?Stream?API中的flatMap方法的相關(guān)資料,flatMap方法是Java?StreamAPI中的重要中間操作,用于將流中的每個元素轉(zhuǎn)換為一個新的流,并將多個流合并為一個單一的流,常用于處理嵌套集合和一對多映射,需要的朋友可以參考下
    2024-12-12
  • Java實現(xiàn)畫線、矩形、橢圓、字符串功能

    Java實現(xiàn)畫線、矩形、橢圓、字符串功能

    本篇文章主要介紹了Java實現(xiàn)畫線、矩形、橢圓、字符串功能的實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • 使用spring.profiles.active來分區(qū)配置的方法示例

    使用spring.profiles.active來分區(qū)配置的方法示例

    這篇文章主要介紹了使用spring.profiles.active來分區(qū)配置的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • Java實現(xiàn)的不同圖片居中剪裁生成同一尺寸縮略圖功能示例

    Java實現(xiàn)的不同圖片居中剪裁生成同一尺寸縮略圖功能示例

    這篇文章主要介紹了Java實現(xiàn)的不同圖片居中剪裁生成同一尺寸縮略圖功能,涉及java針對圖片的讀取、屬性修改等相關(guān)操作技巧,需要的朋友可以參考下
    2017-09-09
  • javaWeb項目部署到阿里云服務(wù)Linux系統(tǒng)的詳細步驟

    javaWeb項目部署到阿里云服務(wù)Linux系統(tǒng)的詳細步驟

    這篇文章主要介紹了javaWeb項目部署到阿里云服務(wù)Linux系統(tǒng),本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • Spring Boot2.0實現(xiàn)靜態(tài)資源版本控制詳解

    Spring Boot2.0實現(xiàn)靜態(tài)資源版本控制詳解

    這篇文章主要給大家介紹了關(guān)于Spring Boot2.0實現(xiàn)靜態(tài)資源版本控制的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11

最新評論

武陟县| 青河县| 靖州| 赤壁市| 久治县| 额尔古纳市| 昌乐县| 永胜县| 汽车| 镇雄县| 闽侯县| 连南| 六盘水市| 灵石县| 盐津县| 基隆市| 龙南县| 东方市| 佛坪县| 临漳县| 龙里县| 思茅市| 乃东县| 华池县| 疏附县| 来安县| 额尔古纳市| 盐亭县| 大冶市| 临朐县| 瑞昌市| 淳安县| 丹江口市| 佛坪县| 怀集县| 扶绥县| 万盛区| 汪清县| 资兴市| 延津县| 呼和浩特市|