条件、谓词和规范之间有什么区别?

2022-09-01 22:51:47

春季数据 JPA - 参考文档中,标准定义如下:

编写条件时,您实际上定义了域类查询的 where 子句。

规范和谓词似乎具有相同的作用。

标准谓词规范之间有什么区别?


答案 1

标准

标准 API 是在 JPA 2.0 中添加的。根据Java Persistence维基教科书

Java 持久性条件 API 用于通过构造基于对象的查询定义对象来定义动态查询,而不是使用 JPQL 的基于字符串的方法。

CriteriaBuilder用于构建一个VariaQuery对象,然后用于执行查询,例如Java持久性wikibook中的此示例:

// Query for a List of objects.
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery();
Root employee = criteriaQuery.from(Employee.class);
criteriaQuery.where(criteriaBuilder.greaterThan(employee.get("salary"), 100000));
Query query = entityManager.createQuery(criteriaQuery);
List<Employee> result = query.getResultList();

谓语

谓词类是条件 API 的一部分,用于构造 where 子句。例如,在从 Java EE 7 文档中摘录的这个修改后的示例中:

CriteriaQuery<Pet> cq = cb.createQuery(Pet.class);
Root<Pet> pet = cq.from(Pet.class);
Predicate predicate1 = cb.equal(pet.get(Pet_.name), "Fido");
Predicate predicate2 = cb.equal(pet.get(Pet_.color), "brown");
cq.where(predicate1.and(predicate2));

规范

规范接口由 Spring Data JPA 项目定义。根据以下博客文章,Advanced Spring Data JPA - Specification and Querydsl,来自Oliver Gierke:

为了能够定义可重用的谓词,我们引入了规范接口,该接口源自 Eric Evans 的 Domain Driven Desig 一书中引入的概念。可以定义规范,例如:

public static Specification<Customer> customerHasBirthday() {
    return new Specification<Customer> {
      public Predicate toPredicate(Root<T> root, CriteriaQuery query, CriteriaBuilder cb) {
        return cb.equal(root.get(Customer_.birthday), today);
      }
    };
  }

然后用于 JpaSpecificationExecutor

List<Customer> customers = customerRepository.findAll(customerHasBirthday());

答案 2

不是来自API文档,而是在我看来:

Criteria是一个抽象的概念,是. 具有所有设置为 s。PredicatesCriteriaQueryCriteriaPredicate

正如一个复数可能说等于.CriteriaCriterionPredicateCriterion

弹簧是要实现的,以提供在构造时使用规范模式的手段。SpecificationCriteriaQueries

请随时用 - 最好是API - 文档来纠正我。


推荐