欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在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時需要根據(jù)role_work_site_relation查詢到有權限的相應機構下的數(shù)據(jù)。

而member_info中存放的機構id是包含其父級機構的。需要再查詢時,首先查出所有的最低一級機構,再根據(jù)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));
        }
    }
 //根據(jù)工地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();

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

相關文章

  • Java 多線程同步 鎖機制與synchronized深入解析

    Java 多線程同步 鎖機制與synchronized深入解析

    從尺寸上講,同步代碼塊比同步方法小。你可以把同步代碼塊看成是沒上鎖房間里的一塊用帶鎖的屏風隔開的空間
    2013-09-09
  • JavaWeb項目實戰(zhàn)之表白墻和在線相冊

    JavaWeb項目實戰(zhàn)之表白墻和在線相冊

    這篇文章主要給大家介紹了關于JavaWeb項目實戰(zhàn)之表白墻和在線相冊的相關資料,JavaWeb表白墻是一款基于JavaWeb技術開發(fā)的表白墻應用,用戶可以在上面發(fā)布表白信息,也可以查看其他用戶的表白信息,需要的朋友可以參考下
    2023-03-03
  • springboot配置多個數(shù)據(jù)源兩種方式實現(xiàn)

    springboot配置多個數(shù)據(jù)源兩種方式實現(xiàn)

    在我們的實際業(yè)務中可能會遇到;在一個項目里面讀取多個數(shù)據(jù)庫的數(shù)據(jù)來進行展示,spring對同時配置多個數(shù)據(jù)源是支持的,本文主要介紹了springboot配置多個數(shù)據(jù)源兩種方式實現(xiàn),感興趣的可以了解一下
    2022-03-03
  • Java之Rsync并發(fā)遷移數(shù)據(jù)并校驗詳解

    Java之Rsync并發(fā)遷移數(shù)據(jù)并校驗詳解

    這篇文章主要介紹了Java之Rsync并發(fā)遷移數(shù)據(jù)并校驗詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-08-08
  • SWT(JFace) Menu、Bar...體驗代碼

    SWT(JFace) Menu、Bar...體驗代碼

    SWT(JFace)體驗之Menu、Bar實現(xiàn)代碼。
    2009-06-06
  • 淺談java對象的比較

    淺談java對象的比較

    這篇文章主要給大家分享java對象的比較,主要有元素的比較、類的比較及比較的方法,想具體了解的小伙伴和小編一起進入下面文章內容吧
    2021-10-10
  • 關于springmvc-servlet中的配置小知識詳解

    關于springmvc-servlet中的配置小知識詳解

    這篇文章主要介紹了關于springmvc-servlet中的配置小知識詳解,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • java 直接調用python腳本,并傳遞參數(shù)代碼實例

    java 直接調用python腳本,并傳遞參數(shù)代碼實例

    這篇文章主要介紹了java調用python腳本傳遞參數(shù)的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-04-04
  • Java計算字符串公式的方式解讀

    Java計算字符串公式的方式解讀

    這篇文章主要介紹了Java計算字符串公式的方式解讀,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java判斷IP地址為內網(wǎng)IP還是公網(wǎng)IP的方法

    Java判斷IP地址為內網(wǎng)IP還是公網(wǎng)IP的方法

    這篇文章主要介紹了Java判斷IP地址為內網(wǎng)IP還是公網(wǎng)IP的方法,針對tcp/ip協(xié)議中保留的三個私有地址進行判斷分析,是比較實用的技巧,需要的朋友可以參考下
    2015-01-01

最新評論