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

Ort*_*kni 8 java spring jpa

Spring Data JPA - 参考文档中,标准定义如下:

编写标准实际上是为域类定义查询的where子句.

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

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

Ort*_*kni 12

Crtieria

所述标准 API是在JPA 2.0添加.根据Java Persistence wikibook:

Java Persistence Criteria API用于通过构造基于对象的查询定义对象来定义动态查询,而不是使用基于字符串的JPQL方法.

A CriteriaBuiler用于构建一个CriteriaQuery对象,然后用于执行查询,例如本例中的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();
Run Code Online (Sandbox Code Playgroud)

谓语

Predicate类是标准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));
Run Code Online (Sandbox Code Playgroud)

规格

Specification接口由Spring Data JPA项目定义.根据以下博客文章,来自Oliver Gierke的Advanced Spring Data JPA - Specifications和Querydsl:

为了能够定义可重用的谓词,我们引入了规范接口,该接口源自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);
      }
    };
  }
Run Code Online (Sandbox Code Playgroud)

然后用在一个JpaSpecificationExecutor.

List<Customer> customers = customerRepository.findAll(isLongTermCustomer());
Run Code Online (Sandbox Code Playgroud)

  • 很好解释.谢谢. (2认同)

pir*_*rho 5

不是来自 API 文档,而是我所看到的:

Criteria是一个抽象的概念,种类的集合PredicatesCriteriaQuery有所有的Criteria集合为Predicates。

As Criteriais 复数形式Criterion可以说Predicate等于Criterion

SpringSpecification旨在提供specification pattern在构造CriteriaQueries.

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