在Spring Data JPA - Reference Documentation中,标准定义为:
编写一个标准,实际上是为域类定义查询的where子句。
规格和谓词似乎具有相同的作用。
criteria,predicate和specification之间有什么区别?
答案 0 :(得分:9)
在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);
}
};
}
List<Customer> customers = customerRepository.findAll(isLongTermCustomer());
答案 1 :(得分:1)
不是来自API文档,但正如我所看到的那样:
Criteria
是一个抽象的概念,是Predicates
的集合。 CriteriaQuery
将所有Criteria
设置为Predicate
s。
由于Criteria
是Criterion
的复数,可能会说Predicate
等于Criterion
。
Spring Specification
旨在实现,以便在构建CriteriaQueries
时提供使用specification pattern
的方法。
随意纠正我 - 最好是API文档。