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

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

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

criteriabuilder使用or拼接多個like語句

項目中有兩張表,一張角色和機構的關系表role_work_site_relation,存放的是機構的id和角色的id,另一張表member_info表中存放用戶相關信息。

機構為樹形結構,role_work_site_relation中存放的是當前角色中的所有機構id。

查詢member_info時需要根據role_work_site_relation查詢到有權限的相應機構下的數據。

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

sql語句類似于

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

sql語句如下

 //查詢工地  搜索框有內容時
 if (!StrUtil.isEmptyIfStr(conditions.get("orgIds"))){
         predicate1.getExpressions().add(criteriaBuilder.equal(root.get("orgIds"), conditions.get("orgIds")));
 //  搜索框沒有內容時,查詢是當前角色下的機構       
  }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));
        }
    }
 //根據工地id查詢用戶相關信息
  if (!StrUtil.isEmptyIfStr(conditions.get("workSite"))) {
        predicate.getExpressions().add(criteriaBuilder.equal(root.join("workSite").get("id"),conditions.get("workSite")));
    }

java-jpa-criteriabuilder使用

一個復雜的查詢例子

包含常用的所有查詢方法

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();     //查詢結果所需要的類型(Entity相對應)
        CriteriaQuery<Entity> criteriaQuery = criteriaBuilder.createQuery(Entity.class);     //查詢所需要的主體類(Entity0相對應)
        Root<Entity0> root = criteriaQuery.from(Entity0.class);     //查詢結果-select(此處查詢所有符合條件的主體類)
        criteriaQuery.select(root);     //過濾條件用Predicate方法拼接
        Predicate restrictions = criteriaBuilder.conjunction();     //過濾條件——equal(當Entity0關聯(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ī)范寫法,先判斷查詢內容是否存在)(適用于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);       //子查詢和父查詢相關聯(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();

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

相關文章

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

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

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

    全面理解Java類和對象

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

    Java中的Optional類用法詳細講解

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

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

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

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

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

    Java實現畫線、矩形、橢圓、字符串功能

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

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

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

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

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

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

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

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

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

最新評論

蓬溪县| 麦盖提县| 什邡市| 伊春市| 抚州市| 辰溪县| 永善县| 洪雅县| 斗六市| 潼南县| 即墨市| 金门县| 阳城县| 萨迦县| 玉林市| 庐江县| 绍兴县| 永登县| 贵州省| 上蔡县| 左权县| 封开县| 昌图县| 聂荣县| 浙江省| 南溪县| 柳林县| 永州市| 颍上县| 丽江市| 门头沟区| 祥云县| 通辽市| 民权县| 泽库县| 黎川县| 五台县| 乐陵市| 剑河县| 北宁市| 邵阳县|