1. 概要

ページ付けは、大きなデータセットがあり、それを小さなチャンクでユーザーに提示したい場合に役立つことがよくあります。

また、ページング中にそのデータをいくつかの基準で並べ替える必要があることがよくあります。

このチュートリアルでは、Spring DataJPAを使用して簡単にページ分割およびソートする方法を学習します。

2. 初期設定

まず、ドメインクラスとしてProductエンティティがあるとします。

@Entity 
public class Product {
    
    @Id
    private long id;
    private String name;
    private double price; 

    // constructors, getters and setters 

}

Productインスタンスには、 id 、その name 、およびそれに関連付けられたpriceという一意の識別子があります。

3. リポジトリの作成

Product にアクセスするには、ProductRepositoryが必要です。

public interface ProductRepository extends PagingAndSortingRepository<Product, Integer> {

    List<Product> findAllByPrice(double price, Pageable pageable);
}

PagingAndSortingRepositoryを拡張することで、ページングと並べ替えのためのfindAll(Pageable pageable)メソッドとfindAll(Sort sort)メソッドを取得します。

逆に、 PagingAndSortingRepository も拡張するため、代わりにJpaRepositoryを拡張することを選択できます。

PagingAndSortingRepository を拡張すると、 findAllByPrice で行ったように、PageableとSortをパラメーターとして受け取る独自のメソッドを追加できます。

新しい方法を使用してProductをページ分割する方法を見てみましょう。

4. ページ付け

PagingAndSortingRepository からリポジトリを拡張したら、次のことを行う必要があります。

  1. Pageableインターフェースの実装であるPageRequestオブジェクトを作成または取得します
  2. PageRequestオブジェクトを引数として使用するリポジトリメソッドに渡します

リクエストされたページ番号とページサイズを渡すことで、PageRequestオブジェクトを作成できます。

ここでページ数はゼロから始まります:

Pageable firstPageWithTwoElements = PageRequest.of(0, 2);

Pageable secondPageWithFiveElements = PageRequest.of(1, 5);

Spring MVCでは、 Spring Data Web Support を使用して、コントローラーでPageableインスタンスを取得することもできます。

PageRequest オブジェクトを取得したら、リポジトリのメソッドを呼び出しながら、次のオブジェクトを渡すことができます。

Page<Product> allProducts = productRepository.findAll(firstPageWithTwoElements);

List<Product> allTenDollarProducts = 
  productRepository.findAllByPrice(10, secondPageWithFiveElements);

The findAll(Pageable pageable) デフォルトでは、メソッドはページ物体。

でも、 どちらかのページを返すことを選択できます 、 スライス 、またはリストページ化されたデータを返すカスタムメソッドのいずれかから

A ページインスタンス、のリストを持っていることに加えて製品 s、利用可能なページの総数についても知っています。 それを達成するために追加のカウントクエリをトリガーします。 このようなオーバーヘッドコストを回避するために、代わりにスライスを返すことができますまたはリスト

スライスは、次のスライスが使用可能かどうかのみを認識します。

5. ページネーションと並べ替え

同様に、クエリ結果を並べ替えるだけで、Sortのインスタンスをメソッドに渡すことができます。

Page<Product> allProductsSortedByName = productRepository.findAll(Sort.by("name"));

ただし、データの並べ替えとページングの両方をしたい場合はどうなりますか?

これを行うには、並べ替えの詳細をPageRequestオブジェクト自体に渡します。

Pageable sortedByName = 
  PageRequest.of(0, 3, Sort.by("name"));

Pageable sortedByPriceDesc = 
  PageRequest.of(0, 3, Sort.by("price").descending());

Pageable sortedByPriceDescNameAsc = 
  PageRequest.of(0, 5, Sort.by("price").descending().and(Sort.by("name")));

並べ替えの要件に基づいて、[X37X] PageRequest インスタンスを作成するときに、並べ替えフィールドと並べ替え方向を指定できます。

いつものように、このPageableタイプのインスタンスをリポジトリのメソッドに渡すことができます。

6. 結論

この記事では、SpringDataJPAでクエリ結果をページ分割およびソートする方法を学習しました。

いつものように、この記事で使用されている完全なコード例は、Githubから入手できます。