📜  示例中的 java jpa criteriabuilder - Java (1)

📅  最后修改于: 2023-12-03 15:41:02.820000             🧑  作者: Mango

Java JPA CriteriaBuilder

Java JPA CriteriaBuilder是Java Persistence API的一部分,提供了一个类型安全、灵活的查询语言,可以在运行时构建和执行类型安全的查询语句。它可以从程序中生成SQL查询语句,并且可以根据运行时信息对查询进行动态修改。

CriteriaBuilder 的优势

相比于传统的SQL语句或者JPQL语句,CriteriaBuilder 有以下优势:

  • 类型安全:CriteriaBuilder 可以在编译时检查查询条件,避免了一些运行时错误。
  • 灵活性:CriteriaBuilder 可以通过编程方式来组合查询条件,非常灵活。
  • 易于维护:CriteriaBuilder 基于对象操作,代码更易于理解和维护。
  • 易于扩展:CriteriaBuilder 可以轻松地集成到现有的Java应用程序中,不需要学习新的语言或库。
CriteriaBuilder 的用法

CriteriaBuilder API 非常庞大,包含各种方法和类。在这里我们只列出一些常用的方法,帮助您开始使用:

获取 CriteriaBuilder 对象

我们需要通过 EntityManager 的 getCriteriaBuilder() 方法来获取 CriteriaBuilder 的实例。例如:

EntityManager entityManager = ...
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
创建 CriteriaQuery

要使用 CriteriaBuilder 进行查询,我们需要创建 CriteriaQuery(一个类型安全的查询对象)。例如,下面的代码段创建一个 CriteriaQuery 来查找 Person 实体类中所有的数据:

CriteriaQuery<Person> criteriaQuery = criteriaBuilder.createQuery(Person.class);
Root<Person> personRoot = criteriaQuery.from(Person.class);
criteriaQuery.select(personRoot);
List<Person> personList = entityManager.createQuery(criteriaQuery).getResultList();
添加查询条件

我们可以使用 Predicate 来设置查询条件。例如,下面的代码片段创建了一个 Predicate,查询名字为 “张三” 的 Person 实体:

CriteriaQuery<Person> criteriaQuery = criteriaBuilder.createQuery(Person.class);
Root<Person> personRoot = criteriaQuery.from(Person.class);

Predicate namePredicate = criteriaBuilder.equal(personRoot.get("name"), "张三");
criteriaQuery.where(namePredicate);

criteriaQuery.select(personRoot);

List<Person> personList = entityManager.createQuery(criteriaQuery).getResultList();
组合查询条件

我们可以使用 conjunction()、disjunction() 和 not() 方法,将多个 Predicate 组合成一个复合 Predicate。例如,下面的代码片段查询年龄为 18 岁并且名字为 “张三” 的 Person 实体:

CriteriaQuery<Person> criteriaQuery = criteriaBuilder.createQuery(Person.class);
Root<Person> personRoot = criteriaQuery.from(Person.class);

Predicate agePredicate = criteriaBuilder.equal(personRoot.get("age"), 18);
Predicate namePredicate = criteriaBuilder.equal(personRoot.get("name"), "张三");

Predicate finalPredicate = criteriaBuilder.and(agePredicate, namePredicate);

criteriaQuery.where(finalPredicate);

criteriaQuery.select(personRoot);

List<Person> personList = entityManager.createQuery(criteriaQuery).getResultList();
使用 GroupBy 和 OrderBy

CriteriaBuilder 还支持使用 GroupBy 和 OrderBy。例如,使用 OrderBy 按照年龄降序排列查询 Person 实体:

CriteriaQuery<Person> criteriaQuery = criteriaBuilder.createQuery(Person.class);
Root<Person> personRoot = criteriaQuery.from(Person.class);

criteriaQuery.orderBy(criteriaBuilder.desc(personRoot.get("age")));

criteriaQuery.select(personRoot);

List<Person> personList = entityManager.createQuery(criteriaQuery).getResultList();
总结

CriteriaBuilder 是 JPA 中非常强大和灵活的查询工具,可以轻松构建类型安全的查询条件和语句,同时还支持排序、分组等操作。使用 CriteriaBuilder 可以提高查询效率、提高代码的可读性和可维护性。