1概要

このチュートリアルでは、非常に便利なJPA機能であるCriteria Queriesについて説明します。

これは生のSQLをせずにクエリを書くことを可能にするだけでなく、クエリに対するオブジェクト指向の制御も可能にします。 Criteria APIを使用すると、プログラムで基準クエリオブジェクトを作成できます。ここでは、さまざまな種類のフィルタルールと論理条件を適用できます。

  • Hibernate 5.2以降、Hibernate Criteria APIは非推奨となり、新しい開発はJPA Criteria APIに焦点を合わせています。


2 Mavenの依存関係

APIを説明するために、参照JPA実装 – Hibernateを使用します。

Hibernateを使用するには、必ず

pom.xml

ファイルに最新バージョンを追加してください。

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.3.2.Final</version>
</dependency>

Hibernateの最新バージョンはhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22org.hibernate%22%20AND%20a%3A%22hibernate-core%22[hereにあります]


3基準を使用した簡単な例

Criteriaクエリを使用してデータを取得する方法を調べることから始めましょう。

データベースから特定のクラスのすべてのインスタンスを取得する方法について説明します。

データベース内のタプル

“ ITEM”

を表す

Item

クラスがあります。

public class Item implements Serializable {

    private Integer itemId;
    private String itemName;
    private String itemDescription;
    private Integer itemPrice;

  //standard setters and getters
}

データベースから「__ITEM」のすべての行を取得する簡単な条件クエリを見てみましょう。

Session session = HibernateUtil.getHibernateSession();
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Item> cr = cb.createQuery(Item.class);
Root<Item> root = cr.from(Item.class);
cr.select(root);

Query<Item> query = session.createQuery(cr);
List<Item> results = query.getResultList();

上記のクエリは、すべての項目を取得する方法を簡単に示したものです。

何が行われたのかを段階的に見てみましょう。


  1. SessionFactory

    オブジェクトから

    Session

    のインスタンスを作成します.

  2. 以下を呼び出してC

    __riteriaBuilder

    __のインスタンスを作成します.


getCriteriaBuilder()

メソッド
。呼び出して

CriteriaQuery

のインスタンスを作成します。


CriteriaBuilder


createQuery()メソッド



Session


createQuery()

を呼び出して、

Query

のインスタンスを作成します。

方法


query

オブジェクトの

getResultList()

メソッドを呼び出します。

結果

基本について説明したので、次に基準照会のいくつかの機能に移りましょう。

** 3.1.



を使う


CriteriaBuilder

は、特定の条件に基づいてクエリ結果を制限するために使用できます。

CriteriaQueryのwhere()メソッドを使用して、

CriteriaBuilder.

によって作成された

Expressions__を提供します。

一般的に使用される



の例をいくつか示します。

1000を超える価格の商品を取得するには

cr.select(root).where(cb.gt(root.get("itemPrice"), 1000));

次に、

itemPrice

が1000未満のアイテムを取得します。

cr.select(root).where(cb.lt(root.get("itemPrice"), 1000));


itemNames

を持つアイテムには、

Chair

が含まれています。

cr.select(root).where(cb.like(root.get("itemName"), "%chair%"));

100〜200の範囲で

itemPrice

を持つレコード:

cr.select(root).where(cb.between(root.get("itemPrice"), 100, 200));

指定したプロパティがnullかどうかを確認するには

cr.select(root).where(cb.isNull(root.get("itemDescription")));

指定したプロパティがnullではないかどうかを確認するには

cr.select(root).where(cb.isNotNull(root.get("itemDescription")));

メソッド内の

isEmpty()

および

isNotEmpty()

を使用して、クラス内の

List

が空かどうかをテストすることもできます。

今度は必然的に問題が起こります。上記の比較を2つ以上組み合わせることができます。答えは、もちろん、そうです –

Criteria APIを使用すると、式を簡単に連鎖させることができます

Predicate[]predicates = new Predicate[2];
predicates[0]= cb.isNull(root.get("itemDescription"));
predicates[1]= cb.like(root.get("itemName"), "chair%");
cr.select(root).where(predicates);

論理演算を使用して2つの式を追加するには

Predicate greaterThanPrice = cb.gt(root.get("itemPrice"), 1000);
Predicate chairItems = cb.like(root.get("itemName"), "Chair%");

上記の条件を持つ項目を

Logical OR

と結合したもの:

cr.select(root).where(cb.or(greaterThanPrice, chairItems));


Logical AND

で結合した上記の条件に一致するアイテムを取得するには、次の手順を実行します。

cr.select(root).where(cb.and(greaterThanPrice, chairItems));


3.2. 並べ替え


Criteria

の基本的な使い方がわかったので、

Criteria

のソート機能を見てみましょう。

次の例では、リストを名前の昇順に並べ替えてから、価格の降順に並べ替えます。

cr.orderBy(
  cb.asc(root.get("itemName")),
  cb.desc(root.get("itemPrice")));

次のセクションでは、集約関数の使い方を見ていきます。


3.3. 予測、集計、およびグループ化機能

これまでのところ、基本的なトピックのほとんどについて説明しました。それでは、さまざまな集約関数を見てみましょう。

行数を取得します。

CriteriaQuery<Long> cr = cb.createQuery(Long.class);
Root<Item> root = cr.from(Item.class);
cr.select(cb.count(root));
Query<Long> query = session.createQuery(cr);
List<Long> itemProjected = query.getResultList();

以下は集約関数の例です。


Average



Aggregate

関数:

CriteriaQuery<Double> cr = cb.createQuery(Double.class);
Root<Item> root = cr.from(Item.class);
cr.select(cb.avg(root.get("itemPrice")));
Query<Double> query = session.createQuery(cr);
List avgItemPriceList = query.getResultList();

利用可能な他の便利な集約メソッドは

sum()



max()



min()





count()

などです


4 HQLを超える利点

前のセクションでは、基準クエリの使用方法について説明しました。

明らかに、HQLを超えるCriteriaクエリの主な、そして最も苦労している利点は、きれいできれいな、オブジェクト指向のAPIです。

単純なHQLと比較して、より柔軟で動的なクエリを簡単に書くことができます。このロジックはIDEでリファクタリングすることができ、Java言語自体のすべての型安全性の利点を備えています。

特により複雑な結合に関しては、もちろんいくつかの欠点もあります。

したがって、一般的に言えば、仕事に最適なツールを使用する必要があります。ほとんどの場合、それはCriteria APIになります。


5結論

この記事では、HibernateとJPAにおけるCriteria Queriesの基本と、APIの高度な機能について説明しました。

ここで議論したコードはhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-hibernate-5[Github repository]にあります。