Criteria API – IN式の例
1. 概要
単一値の属性が特定のコレクションのメンバーであるかどうかに基づいてエンティティをクエリする必要があるという問題にしばしば遭遇します。
このチュートリアルでは、Criteria APIを使用してこの問題を解決する方法を学習します。
2. サンプルエンティティ
始める前に、記事で使用するエンティティを見てみましょう。
Departmentクラスを持つmany-to-one relationshipを持つ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 employees;
}
3. CriteriaBuilder.In
まず、CriteriaBuilderインターフェースを使用しましょう。 The in() method accepts an Expression and returns a new Predicate of the CriteriaBuilder.In type_._指定された式が値のリストに含まれているかどうかをテストするために使用できます。
CriteriaQuery criteriaQuery =
criteriaBuilder.createQuery(DeptEmployee.class);
Root root = criteriaQuery.from(DeptEmployee.class);
In inClause = criteriaBuilder.in(root.get("title"));
for (String title : titles) {
inClause.value(title);
}
criteriaQuery.select(root).where(inClause);
4. Expression.In
または、Expressionインターフェースからオーバーロードされたin()メソッドのセットを使用することもできます。
criteriaQuery.select(root)
.where(root.get("title")
.in(titles));
In a contrast to the CriteriaBuilder.in(), the Expression.in() accepts a collection of values.ご覧のとおり、コードも少し単純化されています。
5. サブクエリを使用したIN式
これまで、定義済みの値を持つコレクションを使用してきました。 次に、コレクションがサブクエリの出力から派生する場合の例を見てみましょう。
たとえば、名前に指定されたキーワードを使用して、Department,に属するすべてのDeptEmployeesをフェッチできます。
Subquery subquery = criteriaQuery.subquery(Department.class);
Root 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));
ここでは、サブクエリを作成し、それを式としてvalue()に渡して、Departmentエンティティを検索しました。
6. 結論
この簡単な記事では、Criteria APIを使用してIN操作を実現するさまざまな方法を学びました。 また、サブクエリでCriteria APIを使用する方法も検討しました。
最後に、このチュートリアルの完全な実装はavailable on GitHubです。