在JPA中criteriabuilder使用or拼接多个like语句

网友投稿 826 2022-09-08


在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.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) {

http:// 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 criteriaQuery = criteriaBuilder.createQuery(Entity.class);     //查询所需要的主体类(Entity0相对应)

Root root = criteriaQuery.from(Entity0.class);     //查询结果-select(此处查询所有符合条件的主体类)

criteriaQuery.select(root);     //过滤条件用Predicate方法拼接

Predicate restrictions = criteriaBuilder.conjunction();     //过滤条件——equal(当Entity0关联member类时,Entity0:member=m:1)

restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.equal(root.get("member"), member));

//过滤条件——like

restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.like(root.get("str"), "%"+str+"%"));

//用户名查询(member里面的username匹配) ———— 多层查询 ———— 子查询的一种:适用于m:1或1:1(即多对一或一对一)

restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.like(root.get("member").get("username"), "%"+username+"%"));

//子查询(规范写法,先判断查询内容是否存在)(适用于1:m)(即一对多)

if (searchType != null || searchValue != null || hasExpired != null || status != null || type != null || isPendingReceive != null || isPendingRefunds != null || isAllocatedStock != null || businessType != null) {

//建立子查询       Subquery orderSubquery = criteriaQuery.subquery(Order.class);

Root orderSubqueryRoot = orderSubquery.from(Order.class);

orderSubquery.select(orderSubqueryRoot);       //子查询和父查询相关联

Predicate orderRestrictions = criteriaBuilder.equal(orderSubqueryRoot.get("mergeOrder"), root);

//子查询过滤条件拼接

if (searchType != null && searchValue != null) {if ("phone".equals(searchType)) {

orderRestrictions = criteriaBuilder.and(orderRestrictions, criteriaBuilder.like(orderSubqueryRoot.get("phone"), "%"+searchValue+"%"));

}

}if (type != null) {

ChENKyFITriteriaBuilder.In in = criteriaBuilder.in(orderSubqueryRoot.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.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.get("expire"), new Date()))

, criteriaBuilder.notEqual(orderSubqueryRoot.get("status"), Order.Status.completed)

, criteriaBuilder.lessThan(orderSubqueryRoot.get("amountPaid"), orderSubqueryRoot.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 query = entityManager.createQuery(criteriaQuery);     Entity singleResult = query.getSingleResult();


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:如何自动生成接口文档,接口文档生成工具有哪些?
下一篇:aws-VPC网络基础知识总结(aws基础服务)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~