基準、述語、仕様の違いは何ですか? 質問する

基準、述語、仕様の違いは何ですか? 質問する

の中に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);
      }
    };
  }

そして、JpaSpecificationExecutor

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

おすすめ記事