PagingResultBean

PagingResultBeanとは?

DBFluteにおけるページング検索で戻されるリスト型の結果オブジェクトです。

会話上では、ぺーじんぐりざるとびーん と表現します。

ListResultBeanを継承

ListResultBean を継承しているため、同様の特徴(例えば、java.util.Listの実装クラスであること)を持っています。 (そのまま for 文でループさせることができます)

e.g. PageRange の利用 {rangeSize=5,fillLimit=true} @Java
PagingResultBean<Member> memberPage = memberBhv.selectPage(cb);
for (Member member : memberPage) { // そのままリストとして扱える
    ...
}

PagingResultBean であることで変わる ListResultBean の特徴は以下の通りです。

allRecordCount
ページングなし総レコード数 (size()と同値ではない)
selectedList
ページング実データ

ページング結果の保持

ページング検索の結果に関する情報を保持しています。具体的には、"ページングなし総レコード数"、"ページング実データ" など。さらに、これらを利用して別の情報(総ページ数など)を導出する計算処理を備えています。

基本的なプロパティと計算ロジック

基本的なプロパティと計算ロジック(メソッド)は以下の通りです。

tableDbName
検索の基点となったテーブルの名前 (ListResultBeanより継承)
allRecordCount
ページングなし総レコード数 (ListResultBeanより継承)
selectedList
ページング実データ (ListResultBeanより継承)
orderByClause
検索時のソート情報 (ListResultBeanより継承)
pageSize
1 ページあたりのレコード数 (検索条件で指定された値)
currentPageNumber
現在のページ番号 (検索条件で指定された値)
allPageCount
総ページ数 (計算)
isExistPrePage()
前のページが存在するか否か (計算)
isExistNextPage()
次のページが存在するか否か (計算)
prePageNumber
前のページ番号 (存在しない場合は例外) (計算)
nextPageNumber
次のページ番号 (存在しない場合は例外) (計算)
currentStartRecordNumber
現在ページの最初のレコード番号 (計算)
currentEndRecordNumber
現在ページの最後のレコード番号 (計算)
e.g. PagingResultBean の基本機能の利用 @Java
PagingResultBean<Member> memberPage = memberBhv.selectPage(cb);
int allRecordCount = memberPage.getAllRecordCount();
int allPageCount = memberPage.getAllPageCount();
if (memberPage.isExistPrePage()) {
    int prePageNumber = memberPage.getPrePageNumber();
}
if (memberPage.isExistNextPage()) {
    int nextPageNumber = memberPage.getNextPageNumber();
}

ページ番号リンクに関する幾つかの方式に対応した計算ロジックを備えています。

PageGroup

ページングナビゲーションのページ番号リンクの表示方式の一つで、あるまとまった単位の複数ページを一つのグループ として定義し、現在表示しているページが所属しているグループのリンクが表示されるようにする方式です。 例えば、10 ページを一つのグループとした場合で、1 ページ目から 10 ページ目までのどのページを表示していても、ページ番号リンクの表示は変わりません(1 から 10 ページ目までのリンクが表示される)。

"前へ" は、"前のページへのリンク" なのか、"前のグループの最後のページへのリンク" なのか、どちらを意味するものなのかを業務仕様的に明確にする必要があります("次へ" も同様)。どちらか片方だけをサポートするパターンと、(リンク文言を工夫して)両方のリンクを別々に作成するパターンがあります。

e.g. PageGroup の表示 {10 ページを一つのグループ,現在 9 ページ目を表示} @GUI
 8 / 23 ページ (453 )
前へ 1 2 3 4 5 6 7 8 9 10 次へ
e.g. PageGroup の表示 {10 ページを一つのグループ,現在 3 ページ目を表示} @GUI
 8 / 23 ページ (453 )
前へ 1 2 3 4 5 6 7 8 9 10 次へ
e.g. PageGroup の表示 {10 ページを一つのグループ,現在 12 ページ目を表示} @GUI
 8 / 23 ページ (453 )
前へ 11 12 12 13 14 15 16 17 18 19 20 次へ

pageGroupSize を指定し、その後で pageGroup() を呼び出すことで、グループに関する計算ロジックを利用することができます。 業務仕様と実装上の利便性を考慮して、必要なメソッドを利用します。

buildPageNumberLinkList()
グループのページ番号リンク情報のリストを作成
createPageNumberList()
グループのページ番号の(単なる数値の)リストを作成
createPageNumberArray()
グループのページ番号の(単なる数値の)配列を作成
isExistPrePageGroup()
前のグループが存在するか否か
isExistNextPageGroup()
次のグループが存在するか否か
preGroupNearestPageNumber
前のグループの直近の(最後の)ページ番号 (存在しない場合は例外)
nextGroupNearestPageNumber
次のグループの直近の(最初の)ページ番号 (存在しない場合は例外)
e.g. PageGroup の利用 {groupSize=10} @Java
PagingResultBean<Member> memberPage = memberBhv.selectPage(cb);
memberPage.setPageGroupSize(10);
List<PageNumberLink> linkList = memberPage.pageGroup().buildPageNumberLinkList(new PageNumberLinkSetupper<PageNumberLink>() {
    public PageNumberLink setup(int pageNumberElement, boolean current) {
        String href = ...
        return new PageNumberLink().initialize(pageNumberElement, current, href);
    }
}
List<Integer> numberList = memberPage.pageGroup().createPageNumberList();
if (memberPage.pageGroup().isExistPrePageGroup()) {
    int preNum = memberPage.pageGroup().getPreGroupNearPageNumber();
}
if (memberPage.pageGroup().isExistNextPageGroup()) {
    int nextNum = memberPage.pageGroup().getNextGroupNearPageNumber();
}

PageRange

ページングナビゲーションのページ番号リンクの表示方式の一つで、前後 n ページのリンクが表示 されるようにする方式です。ロジックが単純で、GUIユーザも理解しやすいのが特徴です。

"前へ" は、"前のページへのリンク" なのか、"Range 外の前のページへのリンク" なのか、どちらを意味するものなのかを業務仕様的に明確にする必要があります("次へ" も同様)。どちらか片方だけをサポートするパターンと、(リンク文言を工夫して)両方のリンクを別々に作成するパターンがあります。

e.g. PageRange の表示 {前後 5 ページを表示,現在 8 ページ目を表示} @GUI
 8 / 23 ページ (453 )
前へ 3 4 5 6 7 8 9 10 11 12 13 次へ
e.g. PageRange の表示 {前後 5 ページを表示,現在 3 ページ目を表示} @GUI
 8 / 23 ページ (453 )
前へ 1 2 3 4 5 6 7 8 次へ

pageRangeSize を指定し、その後で pageRange() を呼び出すことで、Range に関する計算ロジックを利用することができます。業務仕様と実装上の利便性を考慮して、必要なメソッドを利用します。

buildPageNumberLinkList()
Range のページ番号リンク情報のリストを作成
createPageNumberList()
Range のページ番号の(単なる数値の)リストを作成
createPageNumberArray()
Range のページ番号の(単なる数値の)配列を作成
isExistPrePageRange()
前の Range が存在するか否か (前のRange外にページがあるか否か)
isExistNextPageRange()
次の Range が存在するか否か (次のRange外にページがあるか否か)
preRangeNearestPageNumber
前の Range の直近の(最後の)ページ番号 (存在しない場合は例外)
nextRangeNearestPageNumber
次の Range の直近の(最初の)ページ番号 (存在しない場合は例外)
e.g. PageRange の利用 {rangeSize=5} @Java
PagingResultBean<Member> memberPage = memberBhv.selectPage(cb);
memberPage.setPageRangeSize(5);
List<PageNumberLink> linkList = memberPage.pageRange().buildPageNumberLinkList(new PageNumberLinkSetupper<PageNumberLink>() {
    public PageNumberLink setup(int pageNumberElement, boolean current) {
        String href = ...
        return new PageNumberLink().initialize(pageNumberElement, current, href);
    }
}
List<Integer> numberList = memberPage.pageRange().createPageNumberList();
if (memberPage.pageRange().isExistPrePageRange()) {
    int preNum = memberPage.pageRange().getPreRangeNearPageNumber();
}
if (memberPage.pageRange().isExistNextPageRange()) {
    int nextNum = memberPage.pageRange().getNextRangeNearPageNumber();
}

PageNumberLink は DBFlute が提供しているページ番号リンク情報のクラスです。

fillLimit オプション

前後 n ページという条件に加えて、デザイン的な左右のバランスを整えるために不足ページ分を反対側の表示で埋める オプションがあります。例えば、前後 5 ページを表示する場合で、現在 3 ページ目を表示しているときは、8 ページ目まででなく 11 ページ目(表示しなかったページ数 3 を足している)まで表示されるようになり、リンク数が固定されます。 (但し、そもそも総ページ数が少ない場合は、その分リンク数は少なくなります)

e.g. PageRange の表示 {前後5ページを表示(fillLimit),現在3ページ目を表示} @GUI
 8 / 23 ページ (453 )
前へ 1 2 3 4 5 6 7 8 9 10 11 次へ

PageRangeOption に pageRangeSize と fillLimit を指定し、その後で pageRange() を呼び出すことで、fillLimit を利用した Range に関する計算ロジックを利用することができます。

e.g. PageRange の利用 {rangeSize=5,fillLimit=true} @Java
PagingResultBean<Member> memberPage = memberBhv.selectPage(cb);
PageRangeOption option = new PageRangeOption();
option.setPageRangeSize(5);
option.setFillLimit(true);
memberPage.setPageRangeOption(option);
List<Integer> numberList = memberPage.pageRange().createPageNumberList();
boolean existsPre = memberPage.pageRange().isExistPrePageRange();
boolean existsNext = memberPage.pageRange().isExistNextPageRange();

PageGroup, PageRange 共に、buildPageNumberLinkList() を利用することでページングナビゲーションのリンク情報を持った DTO を生成することができます。PageNumberLink は DBFlute が提供しているシンプルな DTO です。プロパティが足りない場合は、このクラスを継承した独自のクラスを指定すると良いでしょう。

e.g. PageRange で PageNumberLink を生成 {rangeSize=5} @Java
PagingResultBean<Member> memberPage = memberBhv.selectPage(cb);
memberPage.setPageRangeSize(5);
List<PageNumberLink> linkList = memberPage.pageRange().buildPageNumberLinkList(new PageNumberLinkSetupper<PageNumberLink>() {
    public PageNumberLink setup(int pageNumberElement, boolean current) {
        String href = ...
        return new PageNumberLink().initialize(pageNumberElement, current, href);
    }
}