构建 CriteriaQuery 实例API说明
CriteriaBuilder 安全查询创建工厂
CriteriaBuilder是一个工厂对象,可以从EntityManager或EntityManagerFactory类中获得。可以用于创建CriteriaQuery、Predicate等1
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery 安全查询主语句
CriteriaQuery对象必须在实体类型或嵌入式类型上的Criteria查询上起作用。它通过调用 CriteriaBuilder.createQuery或CriteriaBuilder.createTupleQuery等获得。1
CriteriaQuery<User> query = builder.createQuery(User.class);
Root 定义查询的 From 子句中能出现的类型
1 | // 获取 User 实体查询的根对象 |
Predicate 过滤条件
过滤条件应用到SQL语句的FROM子句中。
在Criteria查询中,查询条件通过Predicate或Expression实例应用到CriteriaQuery 对象上。这些条件使用CriteriaQuery.where方法应用到CriteriaQuery对象上。
Predicate对象通过调用CriteriaBuilder的equal、notEqual、gt、ge、lt、le、between、like等方法创建。
Predicate实例也可以用Expression实例的isNull、isNotNull和in方法获得,复合的Predicate语句可以使用CriteriaBuilder的and、or方法构建。1
2
3// 查询 id 大于10的用户
Predicate predicate = builder.gt(root.get("id"), 10);
query.where(predicate);
Expression
Expression对象用在查询语句的select、where和having子句中,该接口有isNull、isNotNull和in方法1
2
3
4
5
6
7
8
9
10
11
12
13
14
15// 第一种
CriteriaQuery<User> query = builder.createQuery(User.class);
Root<User> root = query.from(User.class);
query.where(root.get("id").in(1, 5));
entityManager.createQuery(query).getResultList();
// select * from user where id in (1, 5)
// 第二种
Expression<String> exp = root.get("id");
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(5);
predicates.add(exp.in(list));
query.where(predicates.toArray(new Predicate[predicates.size()]));
// select * from user where id in (1, 5)
高级用法
复合查询
1 | // 使用 CriteriaQuery,查询年龄为10,且名字以 ts 开头的用户 |
1 | SELECT |