博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JPA CriteriaBuilder 查询
阅读量:3921 次
发布时间:2019-05-23

本文共 3370 字,大约阅读时间需要 11 分钟。

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) {
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.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();

你可能感兴趣的文章
Leetcode 82. 删除排序链表中的重复元素 II
查看>>
模式5. 代理模式-Java
查看>>
Leetcode 81. 搜索旋转排序数组 II
查看>>
Leetcode 50. Pow(x, n)
查看>>
Leetcode 93. 复原 IP 地址
查看>>
Leetcode 12. 整数转罗马数字
查看>>
Leetcode 16. 最接近的三数之和
查看>>
Leetcode 18. 四数之和
查看>>
Leetcode 27. 移除元素
查看>>
Leetcode 29. 两数相除
查看>>
Leetcode 31. 下一个排列
查看>>
Leetcode 35. 搜索插入位置
查看>>
Leetcode 36. 有效的数独
查看>>
Leetcode 38. 外观数列
查看>>
Leetcode 45. 跳跃游戏 II
查看>>
模式2. 工厂方法模式-Java
查看>>
模式1. 简单工厂模式-Java
查看>>
模式6.原型模式-Java
查看>>
Leetcode 581. 最短无序连续子数组
查看>>
模式7. 模板方法模式--Java
查看>>