パッケージ jakarta.data.page
クエリ結果をページに分割します。
サイズが大きいと予想されるクエリ結果の場合、データベースからすべての結果を一度に取得するのではなく、結果を分割して読み取ると便利な場合があります。
これを実現するには、結果が一貫した順序でソートされていることを確認します。これは、最終的なソート条件を一意の識別子にすることで実現されることが多いですが、順序が決定論的であることが保証されている限り、他の方法でも実現できます。以下は、データをページ単位で読み取ることができるソート条件の例です。
Order<Person> sorts = Order.by(Sort.asc("lastName"), Sort.asc("firstName"), Sort.asc("id")); // unique identifier Page<Person> page1 = people.findByAge(50, sorts, PageRequest.ofSize(25));
上記の例では、複数の人が同じ姓と名を持つ場合でも、一意の識別子により、結果は常に同じ順序になります。予測可能な順序により、データベースからクエリ結果を別々のページで取得することが可能になります。
ページは、固定位置オフセットに基づいて、またはカーソルを基準にして決定できます。
Page
の要素は、結果リスト内の位置オフセットに基づいて計算されます。例: 最初のページの 10 件の結果を取得して次のページをリクエストすると、データベースは位置 11 から 20 にあるクエリに一致するエンティティを識別して取得します。ページリクエスト間でデータが変更されていない場合、結果は予測可能です。2 番目のページをリクエストする前に追加のエンティティが挿入された場合、2 番目のページで取得されるエンティティの一部は、1 番目のページにも表示される可能性があります。同様に、2 番目のページをリクエストする前に 1 番目のページのエンティティが削除された場合、2 番目のページには、現在位置 1 から 10 に移動されているエンティティは含まれません。
上記を回避する必要がある状況、またはアプリケーションがデータベースが前のページからデータを再スキャンする(位置を決定する)ことによるパフォーマンスコストを回避したい場合のために、Jakarta Data は CursoredPage
を使用したカーソルベースのアプローチを提供します。このアプローチでは、次のページまたは前のページのクエリは、現在のページの最後のエントリまたは最初のエントリを基準にして実行されます。
モジュール Javadoc は Jakarta Data の overview
を提供します。
- クラス説明CursoredPage<T>特定のページリクエストを満たすために取得されたデータのページ。ページ上の各結果にカーソルがあります。Page<T>ページには、特定のページリクエストを満たすために取得されたデータが含まれます。クエリ結果の適切に指定された単一のページをリクエストします。キーから形成されるカーソル。これに基づいて次のページまたは前のページをリクエストできます。ページネーションの種類: オフセットベースまたはカーソルベース(方向を含む)。