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()を介してオブジェクトから取得されます。根。
GO TO FULL VERSION