java-jpa-criteriaBuilder使用
一个复杂的查询例子(包含常用的所有查询方法)
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
//查询结果所需要的类型(Entity相对应)
CriteriaQuery<Entity> criteriaQuery = criteriaBuilder.createQuery(Entity.class);
//查询所需要的主体类(Entity0相对应)
Root<Entity0> 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.<String>get("str"), "%"+str+"%"));
//用户名查询(member里面的username匹配) ———— 多层查询 ———— 子查询的一种:适用于m:1或1:1(即多对一或一对一)
restrictions = criteriaBuilder.and(restrictions, criteriaBuilder.like(root.get("member").<String>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<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, criteriaBuilder.or(orderSubqueryRoot.get("expire").isNull(), criteriaBuilder.greaterThan(orderSubqueryRoot.<Date>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.<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));
}
}// 多层查询使用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<Entity> query = entityManager.createQuery(criteriaQuery);
Entity singleResult = query.getSingleResult();
java-jpa-criteriaBuilder使用的更多相关文章
- Java JPA 查询实体部分字段
前言 相信大家在用Java JPA作为ORM的时候都会有这种困惑,就是某个表T我仅仅希望取到其中的A.B.C三个字段,可是jpa是通过Entity Class映射的方式组合查询结果的. 那么如何通过使 ...
- Java JPA小记
什么是JPA JPA之于ORM(持久层框架,如MyBatis.Hibernate等)正如JDBC之于数据库驱动. JDBC是Java语言定义的一套标准,规范了客户端程序访问关系数据库(如MySQL.O ...
- JAVA JPA - 示例用法
JPA(Java Persistence API)是JSR(Java Specification Requests)的一部分,定义了一系列对象持久化的标准,目前实现这一规范的产品有Hibernate. ...
- Java JPA @Transient 在Hibernate中应用
jpa @Transient - 走过程序员的路 - CSDN博客https://blog.csdn.net/lafengwnagzi/article/details/55511066 Hiberna ...
- Java : JPA相关以及常用注解
SpringDataJPA自定义的查询方法 定义规范 And 并且 Or 或 Is,Equals 等于 Between 两者之间 LessThan 小于 LessThanEqual ...
- Java Jpa 规范
Jpa最早是EJB3.0里面的内容,JSR 220: Enterprise JavaBeansTM 3.0 https://www.jcp.org/en/jsr/detail?id=220 后来大约在 ...
- java jpa 报错
表的字段名不能是数据库的关键字 INSERT INTO `todo`.`todo_item` (description, completed) VALUES ('test 111', false); ...
- Java JPA通过hql语句查询数据
import javax.persistence.PersistenceContext; import javax.persistence.Query; public class StudentSer ...
- Java JPA设置默认值、Timestamp设置、自动获取时间
设置默认值 @Column(name="state",columnDefinition="tinyint default 0") private Integer ...
- java jpa 实体关联
关联关系: 1. One to One 2. One to Many 3. Many to One 4 Many to Many 映射: 延迟加载 @Basic(fetch = FetchType.L ...
随机推荐
- (学习1)最小生成树-Prim算法与Kruskal算法
最小生成树: 求一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 1:Prim算法(适合稠密图) 伪代码: Prim(G){ //G ...
- easyapi用法
https://www.easyapi.com/api/?documentId=1773&themeId=
- centos7下安装pcre库(pcretest)
在linux下需要对正则表达式的验证,使用的验证工具是pcretest,这个工具集成在pcre库中,下面是安装教程. 安装环境是centos7. 1)首先去官网下载压缩包文件. 其他的source网站 ...
- 转载--php 7.2 安装 mcrypt 扩展
在 php 官网下载 mcrypt 包,php 扩展官网 # wget http://pecl.php.net/get/mcrypt-1.0.1.tgz # tar xf mcrypt-1.0.1.t ...
- Python开发:在mac系统中安装pip
pip用来安装python项目的依赖库. 大多数比较新的python版本都自带pip,所以先检查下pip是否有安装. 终端输入:pip --version 如果没有安装pip,那么就用接下来的方式安装 ...
- vue 事件总线(bus)
1.全局引入bus Vue.prototype.$bus = new.Vue() 2.组件间传值使用(在发送事件时接收组件会实时接收到, 可以用做兄弟组件间相互传值, 但页面跳转组件间有问题 通过$e ...
- 【代码审计】PHPCMS2008任意代码执行漏洞
很老的漏洞了,但很经典~ 在 phpcms2008/include/global.func.php eval 可以执行命令 在这里我们看一下是谁调用 跟进string2array函数 yp/web/ ...
- node环境下:node_modules里面的文件
node环境下:node_modules里面的文件 package.json来制定名单,需要哪些npm包来参与到项目中来,npm install命令根据这个配置文件增减来管理本地的安装包. depen ...
- event.clientX和event.clientY
event.clientX.event.clientY 鼠标相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条.IE事件和标准事件都定义了这2个属性 event.pageX ...
- C++11特性中的to_string
写在最前面,本文摘录于柳神笔记 to_string 的头⽂件是 #include , to_string 最常⽤的就是把⼀个 int 型变量或者⼀个数字转化 为 string 类型的变量,当然也可以转 ...