微前端架构如何改变企业的开发模式与效率提升
1120
2022-11-14
在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
Root
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.
//用户名查询(member里面的username匹配) ———— 多层查询 ———— 子查询的一种:适用于m:1或1:1(即多对一或一对一)
restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.like(root.get("member").
//子查询(规范写法,先判断查询内容是否存在)(适用于1:m)(即一对多)
if (searchType != null || searchValue != null || hasExpired != null || status != null || type != null || isPendingReceive != null || isPendingRefunds != null || isAllocatedStock != null || businessType != null) {
//建立子查询 Subquery
Root
orderSubquery.select(orderSubqueryRoot); //子查询和父查询相关联
Predicate orderRestrictions = criteriaBuilder.equal(orderSubqueryRoot.
//子查询过滤条件拼接
if (searchType != null && searchValue != null) {if ("phone".equals(searchType)) {
orderRestrictions = criteriaBuilder.and(orderRestrictions, criteriaBuilder.like(orderSubqueryRoot.
}
}if (type != null) {
ChENKyFITriteriaBuilder.In
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.
}
// 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.
, criteriaBuilder.notEqual(orderSubqueryRoot.get("status"), Order.Status.completed)
, criteriaBuilder.lessThan(orderSubqueryRoot.
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
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~