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

时间:2017-11-24 09:13:45

标签: java spring jpa

Spring Data JPA - Reference Documentation中,标准定义为:

  

编写一个标准,实际上是为域类定义查询的where子句。

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

criteriapredicatespecification之间有什么区别?

2 个答案:

答案 0 :(得分:9)

Crtieria

在JPA 2.0中添加了标准 API。根据{{​​3}}:

  

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

Java Persistence wikibook用于构建CriteriaBuiler个对象,然后用于执行查询,例如本例中的CriteriaQuery

// 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();

谓词

Java persistence wikibook类是Criteria API的一部分,用于构造where子句。例如在这个修改过的例子中取自Predicate

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));

规范

Java EE 7 documentation接口由Specification定义。根据以下博客文章Spring Data JPA project,来自Oliver Gierke:

  

为了能够定义可重用的谓词,我们引入了规范接口,该接口源自Eric Evans的Advanced Spring Data JPA - Specifications and Querydsl中引入的概念。   可以定义规范,例如:

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);
      }
    };
  }

然后用于Domain Driven Desig book

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

答案 1 :(得分:1)

不是来自API文档,但正如我所看到的那样:

Criteria是一个抽象的概念,是Predicates的集合。 CriteriaQuery将所有Criteria设置为Predicate s。

由于CriteriaCriterion的复数,可能会说Predicate等于Criterion

Spring Specification旨在实现,以便在构建CriteriaQueries时提供使用specification pattern的方法。

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