基準API - IN式の例

1.概要

単一値属性が特定のコレクションのメンバーであるかどうかに基づいてエンティティを照会する必要があるという問題に遭遇することがよくあります。

このチュートリアルでは、https://www.baeldung.com/hibernate-criteria-queries[ Criteria API]を使用してこの問題を解決する方法を学習します。

2.サンプルエンティティ

私たちが始める前に、私たちの記事で使用するエンティティを見てみましょう。

Department クラスとhttps://www.baeldung.com/hibernate-one-to-many[many-to-one関係]を持つ DeptEmployee クラスがあります。

@Entity
public class DeptEmployee {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;

    private String title;

    @ManyToOne
    private Department department;
}

また、複数の DeptEmployees にマップする Department エンティティもあります。

@Entity
public class Department {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private long id;

    private String name;

    @OneToMany(mappedBy="department")
    private List<DeptEmployee> employees;
}

3. CriteriaBuilder.In

まず最初に、 CriteriaBuilder インターフェースを使用しましょう。 ** in() メソッドは Expression を受け取り、 CriteriaBuilder.In type . の新しい Predicate を返します。指定した式が値のリストに含まれているかどうかをテストするために使用できます。

CriteriaQuery<DeptEmployee> criteriaQuery =
  criteriaBuilder.createQuery(DeptEmployee.class);
Root<DeptEmployee> root = criteriaQuery.from(DeptEmployee.class);
In<String> inClause = criteriaBuilder.in(root.get("title"));
for (String title : titles) {
    inClause.value(title);
}
criteriaQuery.select(root).where(inClause);

4. __式

あるいは、https://javaee.github.io/javaee-spec/javadocs/javax/persistence/criteria/Expression.html[ Expression ]インタフェースから、オーバーロードされた in() メソッドのセットを使用することもできます。

criteriaQuery.select(root)
  .where(root.get("title")
  .in(titles));
  • CriteriaBuilder.in() とは対照的に、 Expression.in() は値のコレクションを受け取ります。

5.副問合せを使用したIN式

これまでは、コレクションを定義済みの値で使用してきました。それでは、コレクションが副照会の出力から派生した場合の例を見てみましょう。

たとえば、 Department、 に属するすべての __DeptEmployee __を、指定したキーワードを名前に使用して取得できます。

Subquery<Department> subquery = criteriaQuery.subquery(Department.class);
Root<Department> dept = subquery.from(Department.class);
subquery.select(dept)
  .distinct(true)
  .where(criteriaBuilder.like(dept.get("name"), "%" + searchKey + "%"));

criteriaQuery.select(emp)
  .where(criteriaBuilder.in(emp.get("department")).value(subquery));

ここでは、 Department エンティティを検索するための式として value() に渡されるサブクエリを作成しました。

6.まとめ

このクイック記事では、Criteria APIを使用してIN操作を実現するためのさまざまな方法を学びました。サブクエリでCriteria APIを使用する方法も調べました。

最後に、このチュートリアルの完全な実装はhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/hibernate5[GitHubで入手可能]です。