JPA Criteria 查询

构建 CriteriaQuery 实例API说明

CriteriaBuilder 安全查询创建工厂

CriteriaBuilder是一个工厂对象,可以从EntityManagerEntityManagerFactory类中获得。可以用于创建CriteriaQueryPredicate

1
CriteriaBuilder builder = entityManager.getCriteriaBuilder();

CriteriaQuery 安全查询主语句

CriteriaQuery对象必须在实体类型或嵌入式类型上的Criteria查询上起作用。它通过调用 CriteriaBuilder.createQueryCriteriaBuilder.createTupleQuery等获得。

1
CriteriaQuery<User> query = builder.createQuery(User.class);

Root 定义查询的 From 子句中能出现的类型

1
2
// 获取 User 实体查询的根对象
Root<User> root = query.from(User.class);

Predicate 过滤条件

过滤条件应用到SQL语句的FROM子句中。

Criteria查询中,查询条件通过PredicateExpression实例应用到CriteriaQuery 对象上。这些条件使用CriteriaQuery.where方法应用到CriteriaQuery对象上。

Predicate对象通过调用CriteriaBuilderequalnotEqualgtgeltlebetweenlike等方法创建。

Predicate实例也可以用Expression实例的isNullisNotNullin方法获得,复合的Predicate语句可以使用CriteriaBuilderandor方法构建。

1
2
3
// 查询 id 大于10的用户
Predicate predicate = builder.gt(root.get("id"), 10);
query.where(predicate);

Expression

Expression对象用在查询语句的selectwherehaving子句中,该接口有isNullisNotNullin方法

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 使用 CriteriaQuery,查询年龄为10,且名字以 ts 开头的用户
Path<String> name = root.get("name");
query.where(
builder.and(
builder.equal(root.get("age"), 10),
builder.like(name, "ts%")
)
);
entityManager.createQuery(query).getResultList();

// 使用 CriteriaBuilder,查询年龄为10,名字以 ts 开头的用户
Path<String> name = root.get("name");
Predicate and = builder.and(
builder.equal(root.get("age"), 10),
builder.like(name, "ts%")
);
1
2
3
4
5
6
7
8
9
10
11
SELECT
user0_.id AS id1_1_,
user0_.age AS age2_1_,
user0_.create_date AS create_d3_1_,
user0_. NAME AS name4_1_,
user0_. STATUS AS status5_1_
FROM
USER user0_
WHERE
user0_.age = 10
AND (user0_. NAME LIKE ?)
  • 本文作者: forever杨
  • 本文链接: https://blog.yl-online.top/posts/6202485a.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。如果文章内容对你有用,请记录到你的笔记中。本博客站点随时会停止服务,请不要收藏、转载!