2.1 Query クラスの概要

ところで、もう 1 つの重要な点は、Query ヘルパー クラスです。次の例でそれを見ることができます。

public List<Employee> getAllEmployes() {
    try (Session session = sessionFactory.openSession()) {
            Query<Employee> query = session.createQuery("from Employee", Employee.class);
            return query.list();
    }
}

実際、Query はインターフェースであり、さまざまなケースに対応するいくつかの実装があります。ただし、わかりやすくするために、これをクラスと呼び続けることにします。これは、広義のクラス、つまり OOP の観点から言えば、クラスです。

ノート。以前は次の 2 つのクラスがありました。

  • クエリを説明するクエリ。
  • TypedQuery は、既知のタイプのクエリを記述します。

最初に登場したのは Hibernate がすでに存在しており、まだジェネリックが存在しなかったときです。その後、JDK 5 のリリース後、別のクラスである TypedQuery が Hibernate に追加されました。これはすでにクエリ結果の型指定をサポートしていました。

しかし、私が覚えている限り、Hibernate の第 5 バージョンからは、型付きクラスが 1 つだけ残され、現在は Query と呼ばれています。

クエリを作成する標準的な方法は次のとおりです。


Query<Employee> query = session.createQuery("from Employee", Employee.class);

Query オブジェクトの作成方法は学習しましたが、これらのクエリはどのように実行するのでしょうか?

ここではさらに簡単です。Queryオブジェクトのlist()メソッドを呼び出すだけです。


Query<Employee> query = session.createQuery("from Employee", Employee.class);
List<Employee> resultLіst = query.list();

list()メソッドにはJPA の同義語があり、同じことを行うメソッドですがgetResultList()と呼ばれます。他のプログラマが書いたコードでそれが見られることがあります。

ちなみに、クエリが結果が 1 つの結果になることを暗示している場合は、 uniqueResult()メソッドを使用してクエリを呼び出す方が簡単です。


Query<Employee> query = session.createQuery("from Employee where id = 1", Employee.class);
Employee result = query.uniqueResult();

uniqueResult()メソッドには、JPA の同義語であるsingleResult()メソッドがあります。これは、Hibernate と JPA 標準との互換性のために導入されました。彼も全く同じことをします。

2.2 クエリクラスのメソッド

実際、Query クラスにはさまざまなメソッドがたくさんあります。以下では、さらに 3 つについて説明します。

1 つ目はstream()メソッドです。そしてそのJPAの同義語であるgetResultStream()

これらのメソッドは両方とも、リストの代わりにデータのストリームを返します。このアプローチは、クエリの結果として取得されたすべてのオブジェクトを一度に必要としない場合に非常に効率的です。または、そのうちの最初のものだけが使用される可能性があります。

例:


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
Stream<Employee> stream = query.stream();

2 番目のメソッドは、executeUpdate()メソッドです。データベース内の何かを変更するクエリを作成できます。この場合、Hibernate がデータベースにアクセスするときに読み取り専用トランザクションを使用しないことが必要です。

要望例:全ユーザーのレベルを1上げることにしました。


Query<User> query = session.createQuery("update User set level=level+1", User.class);
int count = query.executeUpdate();

executeUpdate()メソッドは、実際に変更された行の数を返します。

そして最後の 3 番目のメソッドは、scroll()です。それについてはもう少し詳しく説明します。

2.3 スクロールクラスのメソッド

このメソッドは、 stream()メソッドに似ています。結果をまったく引き出すことなく、結果のリスト内を移動できるのはこれだけです。つまり、クエリを実行し、結果の 100 万行目までスクロールして、そこからデータの読み取りを開始できます。

非常に高度なイテレータです。


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();

ScrollableResultsオブジェクトには次のメソッドがあります。

方法 説明
R get() 現在の要素を返します
次() ポインタを次の要素に移動します
前() ポインタを前の要素に移動します
スクロール(intサイズ) サイズ行ごとに前方にスクロールします
位置(int pos) 要素の位置番号を現在の要素にします
最後() 現在の要素が最後の要素になりました
初め() 現在の要素が最初の要素になりました
getRowNumber() 現在の行番号を返します
setRowNumber() 現在の行番号を設定します

クエリを実行し、最後の要素を取得したいとします。その方法は次のとおりです。


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();
scroll.last();
Employee lastEmployee = scroll.get();