カテゴリ: Spring 更新日: 2025/11/11

SpringのPageableとSortでページング一覧APIを最短実装!初心者向け完全ガイド

ページングとソート(Pageable/Sort)を最短実装:一覧APIの定石
ページングとソート(Pageable/Sort)を最短実装:一覧APIの定石

先生と生徒の会話形式で理解しよう

生徒

「Spring Bootで一覧APIを作るときに、データをページ分けしたいんですけど、どうすればいいですか?」

先生

「SpringにはPageableSortという便利な機能があって、それを使えば簡単にページング処理やソートが実装できますよ。」

生徒

「えっ、それってController側に全部書くんですか?」

先生

「いい質問ですね。実はSpring Data JPAと組み合わせると、リポジトリレイヤーでも簡潔に書けるんです。さっそく一緒に実装してみましょう!」

1. Pageableとは?ページング処理の基本

1. Pageableとは?ページング処理の基本
1. Pageableとは?ページング処理の基本

Spring FrameworkやSpring Bootで一覧データを扱うとき、すべてのレコードを一度に返すのは非効率です。特にデータ件数が多くなると、レスポンスのサイズが大きくなり、APIのパフォーマンスやユーザー体験に影響が出てきます。

その解決策としてよく使われるのが、ページング機能です。SpringではPageableインターフェースを使えば、何件目から何件取得するかといった情報を簡単に指定できます。

さらに、フロントエンドと連携する場合でも、page(ページ番号)、size(ページサイズ)、sort(ソート条件)といったクエリパラメータをURLに追加するだけで、柔軟にページングが可能になります。

2. Spring Data JPAでPageableを使う方法

2. Spring Data JPAでPageableを使う方法
2. Spring Data JPAでPageableを使う方法

Spring Data JPAでは、リポジトリのインターフェースにPageableを引数として渡すだけで、自動的にページング処理が適用されます。


public interface BookRepository extends JpaRepository<Book, Long> {
    Page<Book> findAll(Pageable pageable);
}

そしてControllerでPageableを受け取ると、クエリパラメータに応じたページング処理が実現できます。


@RestController
@RequestMapping("/books")
public class BookController {

    private final BookRepository bookRepository;

    public BookController(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }

    @GetMapping
    public Page<Book> getBooks(Pageable pageable) {
        return bookRepository.findAll(pageable);
    }
}

例えば、/books?page=0&size=5のように呼び出すと、最初の5件が取得されます。

3. Sortを使った並び順の変更

3. Sortを使った並び順の変更
3. Sortを使った並び順の変更

並び順(ソート)も、Sortを通じてPageableに組み込むことができます。ユーザー一覧をname昇順で表示したい場合、?sort=name,ascとするだけです。

複数条件のソートも可能で、?sort=name,asc&sort=id,descと指定することで、まず名前の昇順、その次にIDの降順になります。

リクエストURL例:


/books?page=1&size=10&sort=publishedDate,desc

4. デフォルト値の指定やバリデーションを加える方法

4. デフォルト値の指定やバリデーションを加える方法
4. デフォルト値の指定やバリデーションを加える方法

Pageableの初期値を指定したい場合は、@PageableDefaultアノテーションを使うことで、デフォルトのページサイズやソート条件を設定できます。


@GetMapping("/books/default")
public Page<Book> getBooksDefault(
        @PageableDefault(size = 5, sort = "title", direction = Sort.Direction.ASC)
        Pageable pageable) {
    return bookRepository.findAll(pageable);
}

このようにしておくと、クエリパラメータが指定されなかった場合でも、安定したレスポンスが返せます。

5. ページングレスポンスの中身を理解しよう

5. ページングレスポンスの中身を理解しよう
5. ページングレスポンスの中身を理解しよう

Page<T>型の戻り値には、対象のデータだけでなく、ページ全体に関するメタ情報も含まれています。

  • content:現在のページのデータリスト
  • totalElements:全件数
  • totalPages:総ページ数
  • number:現在のページ番号
  • size:ページサイズ
  • first / last:先頭ページか末尾ページかの判定

この情報を使えば、「次へ」「前へ」などのページネーションリンクも実装しやすくなります。

6. REST APIでページングとソートを活用する実例

6. REST APIでページングとソートを活用する実例
6. REST APIでページングとソートを活用する実例

実務では、検索や一覧画面において、ページングとソートを同時に扱うことが一般的です。

Spring BootでREST APIを作成する際は、以下のようなリクエストURLが実際に使われます。


/books?page=2&size=20&sort=author,desc

APIの戻り値はJSON形式で、フロントエンドに渡しやすく、AngularやReact、Vue.jsなどとも相性抜群です。

7. ページングとソートをカスタムクラスに変換する

7. ページングとソートをカスタムクラスに変換する
7. ページングとソートをカスタムクラスに変換する

Page<T>はそのままだと使いにくい場合もあるため、レスポンスを独自DTO(Data Transfer Object)に変換するのもおすすめです。

例えば、以下のようなレスポンス構造に変換できます:


public class BookPageResponse {
    private List<BookDto> content;
    private int currentPage;
    private int totalPages;
    private long totalElements;
    // getter/setter 略
}

8. PageableとSortを使うときの注意点

8. PageableとSortを使うときの注意点
8. PageableとSortを使うときの注意点

最後に、ページングとソートを使う際のよくある落とし穴を整理しておきます。

  • ソート対象のフィールド名が間違っていると実行時エラーになる
  • デフォルトページサイズが大きすぎるとレスポンスが重くなる
  • ソート条件がユーザー入力のままだとSQLインジェクションの可能性も

こうしたリスクを避けるには、制限を設ける・ログ出力を強化する・明示的なバリデーションを加えることが推奨されます。

カテゴリの一覧へ
新着記事
JavaのHashSetのaddメソッドを完全ガイド!初心者でもわかるセットの使い方
SpringのBindingResultを完全ガイド!初心者でもわかる入力チェックとエラー処理
Spring Securityでフォームログインを実装!ログイン・ログアウト・Remember-Meの設定方法まとめ
Javaの@Validアノテーションを徹底解説!初心者でもわかる入力値検証の基本
人気記事
No.1
Java&Spring記事人気No1
JavaのExceptionクラスを完全解説!初心者でも理解できる例外処理の基本
No.2
Java&Spring記事人気No2
Spring BootとJavaの互換性一覧!3.5/3.4/3.3はJava 21・17に対応してる?
No.3
Java&Spring記事人気No3
JavaのDateクラスの使い方を完全ガイド!初心者でもわかる日付操作
No.4
Java&Spring記事人気No4
Javaのラムダ式anyMatchの使い方:containsやList検索の実践テクニック
No.5
Java&Spring記事人気No5
Javaのラムダ式でListを抽出&変換!filterとmapでスマートに操作
No.6
Java&Spring記事人気No6
JSPで使えるJavaコードの書き方を徹底解説!初心者向けルールと制限ポイント
No.7
Java&Spring記事人気No7
Spring BootのJakarta移行ガイド!初心者向けjavax→jakarta変更ポイント徹底解説
No.8
Java&Spring記事人気No8
Javaのcountの使い方を完全ガイド!ラムダ式で件数カウントの定石をマスターしよう