DBFlute: ConditionBeanのPaging機能のおさらい


【通常の検索】
BookCB cb = new BookCB();
cb.query().setBookName_PrefixSearch("S2Dao");
java.util.List bookList = bhv.selectList(cb);

【先頭から20件のみ検索】
BookCB cb = new BookCB();
cb.query().setBookName_PrefixSearch("S2Dao");
cb.fetchFirst(20);
java.util.List bookList = bhv.selectList(cb);

【1ページ20件で3ページ目(41 - 60)検索】
BookCB cb = new BookCB();
cb.query().setBookName_PrefixSearch("S2Dao");
cb.paging(20, 3);
PagingResultBean bookPageResult = bhv.selectPage(cb);

// Paging無し総件数
int allRecordCount = bookPageResult.getAllRecordCount();

// 1ページ分のList
java.util.List bookList = bookPageResult.getSelectedList();

// 現在ページ
int currentPageNumber = bookPageResult.getCurrentPageNumber();

// 総件数と1ページのサイズ(この場合は20)から計算して求めた総ページ数
int allPageCount = bookPageResult.getAllPageCount();

// 現在ページ番号における開始レコード番号 → この場合は41
int currentStartRecordNumber = bookPageResult.getCurrentStartRecordNumber();

// 現在ページ番号における終了レコード番号 → この場合は60 or 総件数が54件なら54(その数)
int currentStartRecordNumber = bookPageResult.getCurrentEndRecordNumber();

ConditionBeanでPaging処理を指定するだけで、Paging検索ができます。
また、BehaviorのselectPage()を利用することで、
Paging検索画面のページナビゲーションで必要な情報を取得することができます。
(Paging結果の計算処理などはPagingResultBeanが行います)

Pagingは、Performanceを考慮して出来る限りDBで用意された絞込みを利用します。
DBの違いはDBFluteが自動的に判断するので、
利用側はDBの違いによる文法の違いを意識する必要は全くありません

Oracle → ROWNUMを利用
MySQL → Limit/Offsetを利用
PostgreSQL → Limit/Offsetを利用
H2 → Limit/Offsetを利用
Firebird → Firstを利用
SQLServer → TOPを利用 ※Offset機能がないので、そこはResultSet飛ばし
DB2 → FetchFirstRowsOnlyを利用 ※Offset機能がないので、そこはResultSet飛ばし