休止状態での結果ページングの実装(合計行数の取得)
質問
Hibernateでページングを実装するにはどうすればよいですか? Query
オブジェクトには setMaxResults
と呼ばれるメソッドおよび setFirstResult
は確かに役立ちます。しかし、結果の最後のページへのリンクを表示し、 xxx の結果200〜250などを印刷できるように、結果の総数をどこで取得できますか?
解決
Query.setMaxResults(int results)およびQuery.setFirstResult(int offset)を使用できます。
編集:取得する結果の数を知る方法はありません。そのため、最初に" select count(*)..."でクエリを実行する必要があります。少しい、私見。
他のヒント
最大の結果を取得するには、別のクエリを実行する必要があります...新しいレコードが追加された場合、または別の要求が発行されたときにクライアントがページング要求を最初に発行する時間Aから時間Bまでの場合一部のレコードは現在、基準に適合しているため、そのようなものを反映するために再度最大値を照会する必要があります。私は通常、このようにHQLでこれを行います
Integer count = (Integer) session.createQuery("select count(*) from ....").uniqueResult();
Criteria
クエリの場合、通常、このようなDTOにデータをプッシュします
ScrollableResults scrollable = criteria.scroll(ScrollMode.SCROLL_INSENSITIVE);
if(scrollable.last()){//returns true if there is a resultset
genericDTO.setTotalCount(scrollable.getRowNumber() + 1);
criteria.setFirstResult(command.getStart())
.setMaxResults(command.getLimit());
genericDTO.setLineItems(Collections.unmodifiableList(criteria.list()));
}
scrollable.close();
return genericDTO;
2つのクエリを実行できます-count(*)タイプのクエリは、あまりにも多くのテーブルを結合しない場合に安価である必要があり、2番目のクエリは制限が設定されています。次に、存在するアイテムの数はわかりますが、表示されているアイテムのみを取得します。
返される行の最大数にMaxResultsを設定できます。この値を実際の使用可能な行数より大きく設定しても害はありません。他の解決策の問題は、クエリの繰り返しごとにレコードの順序が同じであり、コマンド間で変更が行われないことを前提としていることです。
結果を本当にスクロールしたい場合は、ScrollableResultsを使用することをお勧めします。このオブジェクトをページング間で捨てないで、レコードを同じ順序に保つために使用します。 ScrollableResultsからレコードの数を調べるには、単にlast()の位置に移動してから行番号を取得します。行番号は0からカウントを開始するため、この値には必ず1を追加してください。
個人的には、フロントエンドでページングを処理する必要があると思います。これはそれほど効率的ではないことは知っていますが、少なくともエラーが発生しにくいでしょう。
count(*)を使用する場合、特定のページのリクエストの間にレコードがテーブルから削除されるとどうなりますか?このように多くのことがうまくいかない可能性があります。