の中にSpring Data JPA - リファレンスドキュメント基準は次のように定義されます。
基準を記述すると、実際にはドメイン クラスのクエリの where 句が定義されます。
仕様と述語は同じ役割を持っているようです。
ベストアンサー1
基準
の基準APIはJPA 2.0で追加されました。Java Persistence ウィキブック:
Java Persistence Criteria API は、JPQL の文字列ベースのアプローチを使用するのではなく、オブジェクトベースのクエリ定義オブジェクトの構築を通じて動的クエリを定義するために使用されます。
あCriteriaBuilder
構築するために使用されますCriteriaQuery
オブジェクトは、この例のようなクエリを実行するために使用されます。Java Persistence ウィキブック:
// 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();
述語
のPredicate
クラスはCriteria 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));
仕様
のSpecification
インターフェースは、Spring Data JPA プロジェクト以下のブログ記事によると、高度な Spring Data JPA - 仕様と 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(customerHasBirthday());