- はじめに
- Javaとページング機能とは
- Javaでのページング機能の実装手法
- サンプルコード1:基本的なページング機能の実装
- サンプルコード2:フィルタリング機能付きのページング
- サンプルコード3:ソート機能と組み合わせたページング
- サンプルコード4:Ajaxを利用した非同期ページング
- サンプルコード5:Ajaxを呼び出すJavaScript
- サンプルコード6:エンドレススクロールのJava側
- サンプルコード7:エンドレススクロールの画面側
- サンプルコード8:カスタムデザインのページングUI
- サンプルコード9:ページングUIのCSS
- サンプルコード10:Spring MVCでページ状態を渡す
- サンプルコード11:SQLで必要範囲だけを取得
- サンプルコード12:JDBCでページングSQLを扱う
- サンプルコード13:総件数を取得するSQL
- サンプルコード14:総件数をJavaで取得
- サンプルコード15:複数データソースの設定
- サンプルコード16:URLにページ状態を保存
- サンプルコード17:Thymeleafでリンクを生成
- サンプルコード18:モーダルウィンドウとの連携
- 応用例とさらなる工夫
- 実装時の注意点と対処法
- カスタマイズの方法
- まとめ
- 関連記事
はじめに
Javaでページングを実装する要点は、一覧データをpage、size、offset、limitで扱い、必要範囲だけを返す設計です。検索、ソート、URL保存、非同期更新を重ねると、初心者にも読みやすく、中級者にも拡張しやすくなります。
- Java 21 / JDK 21
- Spring Boot 3.2系 / Spring Data Commons 3.2系 / Thymeleaf 3.1系
- MySQL 8.0 / H2 Database 2.2系 / Bootstrap 5系
画面には必要な行だけが並び、DBやブラウザの負荷を抑えやすくなります。JavaのListやStreamでサンプルコードを学習し、実装ではPreparedStatementやSpring DataのPageableへ広げる流れが自然です。
- Javaでページングを組み立てる基本の考え方
- 検索、フィルタ、ソートを組み合わせる実装の方法
- Ajax、URL、モーダル、エンドレススクロールとの連携
- DB負荷を抑えるための
LIMIT、OFFSET、COUNTの扱い - 初心者から中級者へ進むための設計上の注意点
公式ドキュメントによれば、JavaのListは順序付きコレクションで、整数インデックスによるアクセスを扱えます。詳細はOracle Java SE 21 List APIでsubList()やList.of()を確認できます。
Javaとページング機能とは
Javaの基本概要
Javaはサーバーサイド開発、業務システム、バッチ処理などで広く使われる言語です。JVM上で動き、.classや.jarを介した実行環境をそろえやすいため、一覧画面のページング実装にも向きますし、ここがポイントです。
ArrayList、LinkedList、Map、Optional、Streamなど標準APIも豊富です。初心者はListの切り出しから学習し、中級者はDBクエリやフレームワークのページングへ進むと理解しやすくなります。
ページングの必要性と概要
ページングは大量データを小さな単位に分ける方法です。1000件を一度に描画するより、pageSizeを10件にしてcurrentPageだけを返すほうが、表示も処理も軽くなります。
ただし、件数分割だけでは不足するのが基本です。検索条件、ソート順、総件数、前後ページ、URL共有、アクセシビリティを同じ設計で扱うと、JavaのWebアプリとして効果的です。
| 対象 | 主なAPI | 使いどころ | 注意点 | 関連する学習 |
|---|---|---|---|---|
| 基本分割 | subList() |
Javaだけで小さく試す | 範囲外を避ける | 初心者向け |
| 件数計算 | Math.min() |
末尾ページの調整 | 終了位置を超えない | 境界値 |
| 検索 | filter() |
条件に合う行を残す | 大規模DBではSQL側へ寄せる | Stream |
| ソート | sorted() |
昇順と降順の切替 | ページング前に順序を固定 | Comparator |
| DB取得 | LIMIT |
必要件数だけ読む | RDBMS差に注意 | SQL |
| 開始位置 | OFFSET |
ページ番号から算出 | 深いページで重くなりやすい | インデックス |
| 総件数 | COUNT(*) |
ページ数表示 | 条件と一致させる | 集計 |
| JDBC | PreparedStatement |
SQLパラメータの安全な受け渡し | 例外処理を整理 | DAO |
| Spring MVC | @GetMapping |
URLでページを受ける | 未指定時の既定値 | Controller |
| リクエスト | @RequestParam |
pageやsizeを読む |
不正値を検証 | 入力処理 |
| View | Model |
テンプレートへ渡す | 表示用データに絞る | Thymeleaf |
| JPA | Pageable |
ページとソートをまとめる | ゼロ始まりに注意 | Spring Data |
| ページ結果 | Page<T> |
総ページ数も扱う | 不要ならSliceも検討 |
中級者向け |
| 非同期 | fetch() |
画面の一部更新 | ローディング表示 | JavaScript |
| jQuery | $.ajax() |
既存画面の改修 | 新規なら標準APIも候補 | 互換性 |
| URL保持 | th:href |
共有可能な状態 | 条件もURLに含める | SEO |
| UI | <nav> |
ページ操作領域 | aria-labelを付ける |
アクセシビリティ |
| ボタン | <button> |
非同期操作 | リンクとの使い分け | HTML |
| リンク | <a> |
ページ遷移 | hrefを残す |
共有性 |
| CSS | display:flex |
ページ番号の整列 | 狭い幅を確認 | UI調整 |
| 状態 | active |
現在ページの表示 | 色だけに頼らない | Bootstrap |
| 無効化 | disabled |
先頭や末尾の操作抑制 | サーバー側でも検証 | 入力制御 |
| モーダル | modal |
詳細表示 | フォーカス管理 | UI設計 |
| 複数DB | EntityManager |
データソースをまたぐ | 並び順の統合 | JPA |
| 設定 | application.properties |
接続情報の分離 | 秘密情報を直書きしない | 環境変数 |
| Bean | @Bean |
接続部品の登録 | 名前の衝突を避ける | DI |
| 優先 | @Primary |
既定のBean指定 | 意図をコメントで残す | Spring |
| 限定 | @Qualifier |
対象Beanの明示 | 文字列名の変更に注意 | 保守 |
| 配列切出し | slice() |
クライアント側ページング | 全件保持の上限 | JavaScript |
| 描画 | append() |
追加読み込み | 重複追加を避ける | DOM |
早見表の通り、Javaの学習段階ではsubList()で流れをつかみ、実装ではDB、URL、画面状態へ責務を分けます。内部リンクとして、コレクション理解にはJava List型完全ガイドも併読できます。
Javaでのページング機能の実装手法
Javaでページングを実装する方法は、メモリ上のリスト、SQL、Spring MVC、Spring Dataのどこで分割するかで変わりますが、これは押さえたい点です。サンプルコードでstartとendを確認し、入力検証まで含めると効果的です。
サンプルコード1:基本的なページング機能の実装
JavaのListから開始位置と終了位置を求めます。currentPageが1ならstartは0です。
結果: 期待される出力は、1ページ目に該当するItem1とItem2です。
サンプルコード2:フィルタリング機能付きのページング
検索条件がある画面では、条件で絞った結果をページングします。件数とページ番号が対応しやすくなります。
結果: 期待される出力は、"a"を含む要素の先頭側であるAppleとBananaです。
サンプルコード3:ソート機能と組み合わせたページング
ソートを伴うページングでは、順序を固定してから切り出します。JavaのComparatorで昇順と降順を切り替えられます。
結果: 期待される出力は、昇順に並べ替えられた後の先頭2件であるAppleとBananaです。
サンプルコード4:Ajaxを利用した非同期ページング
非同期ページングでは、JavaサーバーがJSONを返し、ブラウザが一覧部分だけを描画します。
結果: 期待されるレスポンスは、currentPage=1なら["Item1","Item2"]のようなJSON配列です。
実装では入力検証、例外処理、ログ、権限確認、空表示をそろえます。
サンプルコード5:Ajaxを呼び出すJavaScript
画面側はページ番号を送り、成功時にDOMを更新します。既存画面なら$.ajax()、新規ならfetch()も候補です。
結果: 期待される動作は、指定ページのデータを取得し、成功時にsuccess内で描画処理へ渡す流れです。
サンプルコード6:エンドレススクロールのJava側
エンドレススクロールは次のデータを追加する方法です。管理画面では通常のページングと使い分けます。
結果: 期待されるレスポンスは、lastId以降の10件を含む文字列リストです。
サンプルコード7:エンドレススクロールの画面側
スクロールイベントは連続発火しやすいため、loadingフラグを加えます。代替の「もっと読む」ボタンも効果的です。
結果: 期待される表示は、スクロールが下端に近づくたびに#itemListへ項目が追加される形です。
サンプルコード8:カスタムデザインのページングUI
ページングUIは、現在位置、前後移動、無効状態が伝わることが重要です。Java側でprevPageとnextPageを渡すと条件分岐が明確になります。
結果: 期待される表示は、現在ページの数値と、条件に応じた前後ボタンを持つページングUIです。
サンプルコード9:ページングUIのCSS
CSSでは操作領域の並び、余白、ホバー時の色を調整します。Javaとは別でも、ページングの使いやすさに直結します。
結果: 期待される見た目は、中央に並んだ青系の前後ボタンと現在ページ表示です。
サンプルコード10:Spring MVCでページ状態を渡す
prevPageがnullなら先頭、nextPageがnullなら末尾と判断できます。
結果: 期待される処理は、指定ページに対応する前後ページ番号をテンプレートへ渡す流れです。
サンプルコード11:SQLで必要範囲だけを取得
DB連携では、Javaのメモリへ全件を読む方法を避けます。SQLで必要な行だけ取得し、JavaはDTOやエンティティへ詰めます。
結果: 期待される取得範囲は、id順に並べたうえで31件目から40件目までの10行です。
安定したORDER BYを指定し、深いOFFSETの負荷も確認するのが目安です。
サンプルコード12:JDBCでページングSQLを扱う
一覧SQLと総件数SQLは同じ検索条件でそろえます。Javaの例外処理はログや呼び出し元への通知も決めます。
結果: 期待される戻り値は、offsetとlimitに対応するItemのリストです。
limitとoffsetはサーバー側で検証してから渡するのがポイントです。
サンプルコード13:総件数を取得するSQL
総件数はページ番号リンクの材料です。検索条件がある場合は、一覧取得と同じWHERE条件をCOUNT(*)にも適用します。
結果: 期待される取得値は、itemsテーブルに含まれる総行数です。
件数表示が不要なら、次ページ有無だけ返す設計も候補です。
サンプルコード14:総件数をJavaで取得
Java側では総件数を整数として返し、画面でtotalPagesや前後リンクの判定に使います。
結果: 期待される戻り値は、ページ数計算に使える総件数の整数値です。
サンプルコード15:複数データソースの設定
複数データソースのページングは、結果を足すだけでは順序や件数がぶれますし、これが一つの目安です。統合キー、並び順、同時刻データの扱いを明確にします。
結果: 期待される設定は、H2用とMySQL用の接続情報が別プレフィックスで読み込まれる形です。
Java設定では@Primaryや@Qualifierで対象Beanを明示します。
サンプルコード16:URLにページ状態を保存
URLにページ状態を入れると、ブックマークや共有がしやすくなるのが一般的です。JavaのControllerでpageを受け取り、Thymeleafのth:hrefで条件を残します。
結果: 期待される処理は、/items?page=2のようなURLから2ページ目のデータを作る流れです。
検索やソートを加える場合も、同じ規則でURLへ残します。
サンプルコード17:Thymeleafでリンクを生成
検索語や並び順もURLに含めると、同じ状態を再現できます。?query=java&page=2&sort=nameのようにそろえると、Java側のテストもしやすくなるのが現実的です。
結果: 期待されるHTMLは、現在ページから前後のページへ移動できるリンクを生成する形です。
サンプルコード18:モーダルウィンドウとの連携
モーダルとページングでは、一覧のページ状態と詳細表示を分けます。一覧は/products、詳細は/product/detailsのように分けると責務が明確です。
結果: 期待される処理は、一覧表示と詳細テンプレートの取得を別々のメソッドで扱う形です。
応用例とさらなる工夫
基本のページングが整ったら、検索、複数ソート、総件数、表示件数変更を組み合わせます。JavaではControllerに詰め込まず、検索条件オブジェクトやサービス層へ分けます。
サンプルコード19:ページングと検索機能の組み合わせ
検索とページングを組み合わせると、大量データから目的の行へ近づきやすくなると整理できます。初心者はqueryが空のときの扱いを先に決めます。
結果: 期待される処理は、/search?query=Result&page=2の条件に合う検索結果の2ページ目を返す形です。
実装では検索処理をリポジトリや外部APIに置き換えます。Javaのアノテーション整理にはJavaアノテーションの12選が役立ちます。
サンプルコード20:マルチカラムのソートとページング
中級者向けの一覧では、名前の昇順と作成日の降順のように複数条件で並べる場面があると理解できます。Spring Dataの概念はSpring Data Commons公式リファレンスで確認できます。
結果: 期待される処理は、2列のソート条件を持つPageableでリポジトリからページを取得する形です。
sort1やsort2は、許可する列名をSetやenumで制限する実装が効果的です。
💡 Tips: ページング、検索、ソートをURLに残すと、戻る操作や共有リンクの再現性が高まります。管理画面では
page、size、sort、queryを同じ規則で扱うと学習後の拡張もしやすくなります。
実装時の注意点と対処法
ページングの不具合は、境界値、DB負荷、画面状態、入力検証に集中すると覚えるとよいでしょう。Javaではpage < 1、sizeの上限、存在しないページへのアクセスを扱います。
データベースの負荷について
大量データでは、深いOFFSETほどDBが読み飛ばす行数が増えます。通常ページはLIMITとOFFSET、タイムラインはキーセットページングも候補です。
結果: 期待される処理は、currentPageから計算した範囲だけをSQLで取得する流れです。
Java側でpageSizeの最大値を制限し、size=100000のような入力は丸めます。
SELECT *は学習用の簡略表現です。実装では必要な列だけを選び、検索条件に合うインデックスを検討します。ユーザーエクスペリエンスの向上方法
ページ遷移が重い場合は、非同期読み込みで一覧部分だけを差し替えますが、覚えておくと役立つでしょう。戻るボタンやURL共有を保つには、履歴APIやクエリパラメータも設計します。
結果: 期待される表示は、初期データを読み込み、ボタン押下ごとに次ページの内容を#contentへ追加する形です。
非同期処理では、読み込み中、失敗時、二重クリック防止を入れます。Java側のAPIは空配列やエラーJSONを一貫した形式で返します。
slice()があると考えられます。仕様や引数の扱いはMDNのArray.prototype.slice()で確認できます。入力値はpageを1以上、sizeを許可範囲内に丸めます。境界値の学習にはJavaでうるう年を判定も使えると言えるでしょう。
カスタマイズの方法
カスタマイズでは、デザイン、表示件数、非同期化、DB負荷、アクセシビリティを同時に見ます。Javaの実装が正しくても、現在ページが分からないUIは使いづらくなります。
デザイン面での工夫
ページングのデザインでは、現在ページ、前後移動、無効状態を視覚とマークアップで表するのが基本です。Bootstrapでも<nav>のaria-labelやリンクの意味を残します。
結果: 期待される表示は、Bootstrapのpaginationスタイルが適用されたページ操作領域です。
href="#"だけではURL共有に向きません。Javaの画面遷移なら?page=2、Ajax操作なら<button>を使うと整理できます。
パフォーマンスの向上手法
クライアント側ページングは、全データを取得してブラウザで切り替える方法です。少量データには効果的ですが、大量データでは初回読み込みとメモリ使用量が増えます。
結果: 期待される処理は、allDataから現在ページの範囲だけを切り出してDOM更新へ渡す形です。
小規模ならJavaScriptのslice()、中規模以上ならJava APIやSQLで分割するのが目安です。文字列の扱いはJavaエスケープ処理の10ステップマスターガイドも確認できます。
既存クラスを拡張して条件を差し込む場合は、オーバーライドの理解が役立ちます。関連する考え方はJavaでマスターする!オーバーライドのたった7つのステップで補えますし、ここを基本と考えるとよいでしょう。
初心者向けの学習ではList、中級者向けの実装ではPageable、負荷を意識する画面ではSQLとインデックスを中心に考えます。目的ごとに方法を選ぶことが重要です。
まとめ
Javaでページングを実装する際は、page、size、sort、queryをそろえて扱うと、検索やソートを追加しやすくなります。初心者はList.subList()のサンプルコードで開始位置と終了位置を学習し、中級者はPageable、LIMIT、OFFSET、COUNT(*)へ広げますし、ここがポイントです。
DB負荷を抑える実装、URLに状態を残す方法、Ajaxで一部更新する方法、モーダルやエンドレススクロールとの組み合わせを選びます。ページングはJavaコードだけでなくHTML、CSS、JavaScript、SQLを同じ粒度で整えることが効果的です。
実装前には、対象件数、検索条件、並び順、URL共有、アクセシビリティを確認します。利用者が探しやすく、開発者が保守しやすい方法を選ぶことが基本です。
関連記事
- Java List型完全ガイド!初心者でもマスターできる7つのステップ
- Javaアノテーションの12選!初心者から上級者まで徹底ガイド
- Javaでうるう年を判定!初心者でも分かる9ステップ解説
- Javaエスケープ処理の10ステップマスターガイド
- Javaでマスターする!オーバーライドのたった7つのステップ
※本記事は実在のエンジニア複数名で構成される Japanシーモア編集部が、AI支援を活用して作成・校正・公開しています。


