Criteria API の概要

Hibernate でデータベース クエリを作成するには 2 つの方法があります。

  • Hibernate クエリ言語
  • 基準API

最初のものはずっと前にすでに知っているので、今度は Criteria API について知りましょう。これは非常に強力なツールであり、ある時点では HQL よりも人気がありました。現在ではあまり人気がありませんが、一部のタスクでは間違いなく HQL よりも優れたソリューションとなるでしょう。

いずれにせよ、Criteria API に慣れないと Hibernate を学ぶことはできません。小さな例を書いて、それを分析してみましょう。たとえば、データベースからすべての従業員 (Employee) をリクエストします。得られるものは次のとおりです。

CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Employee> critQuery = builder.createQuery(Employee.class);

Root<Employee> root = critQuery.from(Employee.class);
critQuery.select(root);

Query<Employee> query = session.createQuery(critQuery);
List<Employee> results = query.getResultList();

複雑そうに見えます。比較のために同じ HQL クエリを作成してみましょう。

String hqlQuery = "from Employee";

Query<Employee> query = session.createQuery(hqlQuery);
List<Employee> results = query.getResultList();

両方の例の最後の 2 行はほぼ同じであることに注意してください。Query オブジェクトを作成し、それを使用して List を取得します。これは、残りの行が同じことを行っていることを示唆しています。

最初の例の 3 行目と 4 行目を見てください。

Root<Employee> root = critQuery.from(Employee.class);
critQuery.select(root);

それらを 1 行で書いてみましょう。

critQuery.select(critQuery.from(Employee.class));

何か思い出しませんか?そして、少し違う色にすると、次のようになります。

critQuery.select(critQuery.from(Employee.class));

はい、これは SELECT FROM クエリの非常に難しい構造です。

Criteria API の使用例

より深く理解していただくために、いくつかの例を示します。

要望1.給与が 10,000 を超えるすべての従業員を取得します。

critQuery.select(critQuery.from(Employee.class)).where(builder.gt(root.get("salary"), 10000));

要望2.給与が 50,000 未満のすべての従業員を取得します。

critQuery.select(critQuery.from(Employee.class)).where(builder.lt(root.get("salary"), 50000));

要望3.役職名に「test」という単語が含まれるすべての従業員を取得します。

critQuery.select(critQuery.from(Employee.class)).where(builder.like(root.get("occupation"), "%test%"));

要望4.すべての従業員の給与が 10 ~ 50,000 になるようにします。

critQuery.select(critQuery.from(Employee.class)).where(builder.between(root.get("salary"), 10000, 50000));

要望5.名前が null の従業員をすべて取得します。

critQuery.select(critQuery.from(Employee.class)).where(builder.isNull(root.get("name")));

要望6.名前が null ではないすべての従業員を取得します。

critQuery.select(critQuery.from(Employee.class)).where(builder.isNotNull(root.get("name")));

クエリを作成するのは非常に難しい方法です。

  • まずオブジェクトを取得します基準ビルダー
  • 次に、それを使用してオブジェクトを作成します基準クエリ
  • 次に、それにパーツを追加し始めます基準クエリ基準ビルダー

次のパラメータを設定する方法は次のとおりです。

  • 選択する
  • から
  • どこ

も使用しています基準ビルダーWHERE に対してさまざまな条件を構築できます。

Criteria API を使用した高度な作業

Criteria API を使用すると、任意の複雑さのクエリを構築できます。そして、これは素晴らしいニュースです。たとえば、複雑な WHERE 句が必要だとします。その方法は次のとおりです。

Predicate greaterThan = builder.gt(root.get("salary"), 1000);
Predicate testers = builder.like(root.get("occupation"), "test%");

critQuery.select(critQuery.from(Employee.class)).where(builder.or(greaterThan, testers));

OR の代わりに AND を書きたい場合は、最後の行を変更するだけです。

critQuery.select(critQuery.from(Employee.class)).where(builder.and(greaterThan, testers));

実際にはすべてが非常にシンプルです。いくつかの比較を含む表を示します。

SQL 方法 全記録
a<b lt(a, b) builder.lt(a, b)
a > b gt(a, b) builder.gt(a, b)
a または b または(a,b) builder.or(a, b)
aとb そして(a,b) builder.and(a,b)
a いいね b (a,b) のように builder.like(a, b)
(c, d) の間 (a, c, d) の間 builder.between(a, c, d)
a は NULL です isNull(a) builder.isNull(a)
a は NULL ではありません isNotNull(a) builder.isNotNull(a)

どれもシンプルですね。

そして、クエリに並べ替えを追加するにはどうすればよいでしょうか? とてもシンプルです:

critQuery.select( critQuery.from(Employee.class) );
critQuery.where( builder.and(greaterThan, testers) );
critQuery.orderBy( builder.asc(root.get("salary"), builder.desc(root.get("joinDate") )

オブジェクトを呼び出すだけです基準クエリorderBy()メソッドを作成し、必要なパラメータをそれに渡します。

同じクエリが HQL でどのように表示されるかを次に示します。比較:

select * from Employee
where (…) and (…)
order by 'salary' asc, 'joinDate' desc

覚えておく必要があるのは次の 3 つだけです。

  • SELECT、FROM、WHERE などのキー演算子がオブジェクトに対して呼び出されます基準クエリ
  • AND、OR、DESC などの補助演算子がオブジェクトに対して呼び出されます。基準ビルダー
  • フィールド名はget()を介してオブジェクトから取得されます。