在JPA中criteriabuilder使⽤or拼接多个like语句
⽬录
criteriabuilder使⽤or拼接多个like语句
sql语句类似于
sql语句如下
java-jpa-criteriabuilder使⽤
⼀个复杂的查询例⼦
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.("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.("orgIds"),"%" + dataPermission));
}
}
}
//根据⼯地id查询⽤户相关信息
if (!StrUtil.("workSite"))) {
}
java-jpa-criteriabuilder使⽤
⼀个复杂的查询例⼦
包含常⽤的所有查询⽅法
CriteriaBuilder criteriaBuilder = CriteriaBuilder(); //查询结果所需要的类型(Entity相对应)
jpa mybatisCriteriaQuery<Entity> criteriaQuery = ateQuery(Entity.class); //查询所需要的主体类(Entity0相对应)
Root<Entity0> root = criteriaQuery.from(Entity0.class); //查询结果-select(此处查询所有符合条件的主体类)
criteriaQuery.select(root); //过滤条件⽤Predicate⽅法拼接
Predicate restrictions = junction(); //过滤条件——equal(当Entity0关联member类时,Entity0:member=m:1)
restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.("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.("member").<String>get("username"), "%"+username+"%"));
//⼦查询(规范写法,先判断查询内容是否存在)(适⽤于1:m)(即⼀对多)
if (searchType != null || searchValue != null || hasExpired != null || status != null || type != null || isPend
ingReceive != null || isPendingRefunds != null || isAllocatedStock != null || businessType != null) { //建⽴⼦查询 Subquery<Order> orderSubquery = criteriaQuery.subquery(Order.class);
Root<Order> orderSubqueryRoot = orderSubquery.from(Order.class);
orderSubquery.select(orderSubqueryRoot); //⼦查询和⽗查询相关联
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, (("expire").isNull(), aterThan(orderSubqueryRoot.<Date>get("expire"), new Date()))); }
// not的使⽤⽅法(不符合上述过滤条件),notEqual的使⽤,<(⼩于)的使⽤
if (isPendingReceive != null) {
restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.("paymentMethodType"), P
aymentMethod.Type.cashOnDelivery));
Predicate predicate = criteriaBuilder.(("expire").isNull()
, aterThan(orderSubqueryRoot.<Date>get("expire"), new Date()))
, ("status"), Order.Statuspleted)
, criteriaBuilder.lessThan(orderSubqueryRoot.<BigDecimal>get("amountPaid"), orderSubqueryRoot.<BigDecimal>get("amount")));
if (isPendingReceive) {
orderRestrictions = criteriaBuilder.and(orderRestrictions, (predicate));
}
}// 多层查询使⽤if (businessType != null) {
orderRestrictions = criteriaBuilder.and(orderRestrictions, criteriaBuilder.("store").get("business").get("businessType"), businessT
ype));
} // 拼接过滤条件
orderSubquery.where(orderRestrictions);
// 和总条件拼接(exists的使⽤)
restrictions = criteriaBuilder.and(restrictions, ists(orderSubquery));
}
criteriaQuery.where(restrictions); TypedQuery<Entity> query = ateQuery(criteriaQuery); Entity singleResult = SingleResult();以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论