在JPA中criteriabuilder使用or拼接多個(gè)like語(yǔ)句
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深入解析
從尺寸上講,同步代碼塊比同步方法小。你可以把同步代碼塊看成是沒(méi)上鎖房間里的一塊用帶鎖的屏風(fēng)隔開(kāi)的空間2013-09-09JavaWeb項(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-03springboot配置多個(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-03Java之Rsync并發(fā)遷移數(shù)據(jù)并校驗(yàn)詳解
這篇文章主要介紹了Java之Rsync并發(fā)遷移數(shù)據(jù)并校驗(yàn)詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08SWT(JFace) Menu、Bar...體驗(yàn)代碼
SWT(JFace)體驗(yàn)之Menu、Bar實(shí)現(xiàn)代碼。2009-06-06關(guān)于springmvc-servlet中的配置小知識(shí)詳解
這篇文章主要介紹了關(guān)于springmvc-servlet中的配置小知識(shí)詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12java 直接調(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-04Java判斷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