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

在JPA中criteriabuilder使用or拼接多個(gè)like語(yǔ)句

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

criteriabuilder使用or拼接多個(gè)like語(yǔ)句

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

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

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

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

sql語(yǔ)句類(lèi)似于

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

sql語(yǔ)句如下

 //查詢(xún)工地  搜索框有內(nèi)容時(shí)
 if (!StrUtil.isEmptyIfStr(conditions.get("orgIds"))){
         predicate1.getExpressions().add(criteriaBuilder.equal(root.get("orgIds"), conditions.get("orgIds")));
 //  搜索框沒(méi)有內(nèi)容時(shí),查詢(xún)是當(dāng)前角色下的機(jī)構(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查詢(xún)用戶相關(guān)信息
  if (!StrUtil.isEmptyIfStr(conditions.get("workSite"))) {
        predicate.getExpressions().add(criteriaBuilder.equal(root.join("workSite").get("id"),conditions.get("workSite")));
    }

java-jpa-criteriabuilder使用

一個(gè)復(fù)雜的查詢(xún)例子

包含常用的所有查詢(xún)方法

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();     //查詢(xún)結(jié)果所需要的類(lèi)型(Entity相對(duì)應(yīng))
        CriteriaQuery<Entity> criteriaQuery = criteriaBuilder.createQuery(Entity.class);     //查詢(xún)所需要的主體類(lèi)(Entity0相對(duì)應(yīng))
        Root<Entity0> root = criteriaQuery.from(Entity0.class);     //查詢(xún)結(jié)果-select(此處查詢(xún)所有符合條件的主體類(lèi))
        criteriaQuery.select(root);     //過(guò)濾條件用Predicate方法拼接
        Predicate restrictions = criteriaBuilder.conjunction();     //過(guò)濾條件——equal(當(dāng)Entity0關(guān)聯(lián)member類(lèi)時(shí),Entity0:member=m:1)
        restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.equal(root.get("member"), member));
        //過(guò)濾條件——like
        restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.like(root.<String>get("str"), "%"+str+"%"));
        //用戶名查詢(xún)(member里面的username匹配) ———— 多層查詢(xún) ———— 子查詢(xún)的一種:適用于m:1或1:1(即多對(duì)一或一對(duì)一)
        restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.like(root.get("member").<String>get("username"), "%"+username+"%"));
        //子查詢(xún)(規(guī)范寫(xiě)法,先判斷查詢(xún)內(nèi)容是否存在)(適用于1:m)(即一對(duì)多)
        if (searchType != null || searchValue != null || hasExpired != null || status != null || type != null || isPendingReceive != null || isPendingRefunds != null || isAllocatedStock != null || businessType != null) {
            //建立子查詢(xún)        Subquery<Order> orderSubquery = criteriaQuery.subquery(Order.class);
            Root<Order> orderSubqueryRoot = orderSubquery.from(Order.class);
            orderSubquery.select(orderSubqueryRoot);       //子查詢(xún)和父查詢(xún)相關(guān)聯(lián)
            Predicate orderRestrictions = criteriaBuilder.equal(orderSubqueryRoot.<MergeOrder>get("mergeOrder"), root);
            //子查詢(xún)過(guò)濾條件拼接
            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的使用方法(不符合上述過(guò)濾條件),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));
                }
            }// 多層查詢(xún)使用if (businessType != null) {
                orderRestrictions = criteriaBuilder.and(orderRestrictions, criteriaBuilder.equal(orderSubqueryRoot.get("store").get("business").get("businessType"), businessType));
            }       // 拼接過(guò)濾條件
            orderSubquery.where(orderRestrictions);
            // 和總條件拼接(exists的使用)
            restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.exists(orderSubquery));
        }
        criteriaQuery.where(restrictions);     TypedQuery<Entity> query = entityManager.createQuery(criteriaQuery);     Entity singleResult = query.getSingleResult();

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

相關(guān)文章

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

    Java 多線程同步 鎖機(jī)制與synchronized深入解析

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

    JavaWeb項(xiàng)目實(shí)戰(zhàn)之表白墻和在線相冊(cè)

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

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

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

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

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

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

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

    淺談java對(duì)象的比較

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

    關(guān)于springmvc-servlet中的配置小知識(shí)詳解

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

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

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

    Java計(jì)算字符串公式的方式解讀

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

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

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

最新評(píng)論