Paging

概要

基本概念

ページングの設定をします。この機能を使うことで Behavior の selectPage(cb) が利用できます。

ページングの実現方法は、DBMSごとに異なりますが、基本的にDBMS固有のSQL構文を使って実現されます。 例えば、MySQL なら limit、PostgreSQL なら limit, offset、Oracle なら rounum。 但し、一部 DBMS (SQLServerなど) では、limit, offset の片方がサポートされていない、もしくは、両方サポートされていないことがあるので、 そういうサポートされていない場合に限り、部分的にカーソルスキップで実現されます。

会話上では、ぺーじんぐ と表現します。文脈上、曖昧で伝わりにくい場合は ConditionBeanのぺーじんぐ(機能) などと言うとわかりやすいでしょう。

実装方法

実装の流れ

まずは通常通り、ConditionBean の設定をし、実行する前に paging() を呼び出して、第一引数(pageSize)に 1 ページのレコード数(ページサイズ)、第二引数(pageNumber)に 検索するページ番号 を設定します。その後、Behavior の selectPage() を呼び出します。

e.g. 1 ページに付き20件で、3 ページ目を検索 (Eclipseでコード補完) @Java
int currentPageNumber = 3; // 実業務では、画面などで指定されたページ番号など
MemberCB() cb = new MemberCB();
cb.setupSelect_MemberStatus();
cb.query().addOrderBy_Birthdate_Desc();
cb.pa // .pa と打って enter
--
cb.paging(20, currentPageNumber);
PagingResultBean<Member> memberPage = memberBhv.selectPage(cb);
int allRecordCount = memberPage.getAllRecordCount();
int allPageCount = memberPage.getAllPageCount();
for (Member member : memberPage) {
    ...
}
...

PagingResultBean には、指定されたページ番号のデータが格納されています。

カウント検索を後に (CountLater)

enablePagingCountLater() を呼び出すことで、カウント検索を後に実行することができます。ただ、この機能は DBFlute の設定として デフォルトで有効 になっているので(@since 0.9.9.0A)、プロパティで抑制していない限り明示的に呼び出す必要はありません。 (つまり、通常は意識する必要はありません)

e.g. カウント検索をページング実データ検索の後に実行 @Java
MemberCB() cb = new MemberCB();
cb.setupSelect_MemberStatus();
cb.query().addOrderBy_Birthdate_Desc();
cb.paging(20, currentPageNumber);
cb.enablePagingCountLater();
...

逆に局所的にカウント検索を先に実行したい場合は、disablePagingCountLater() を呼び出します。

カウント検索の結合を最小限に (CountLeastJoin)

enablePagingCountLeastJoin() を呼び出すことで、カウント検索において必要性を自動判別して結合(Join)を最小限にすることができます(@since 0.9.8.8)。 ただ、この機能は DBFlute の設定として デフォルトで有効 になっているので(@since 0.9.9.0A)、プロパティで抑制していない限り明示的に呼び出す必要はありません。 (つまり、通常は意識する必要はありません)

ただし、Union を利用している場合は、いずれにせよ最小限にするための処理はされません。

e.g. カウント検索で結合を最小限に @Java
MemberCB() cb = new MemberCB();
cb.setupSelect_MemberStatus();
cb.query().addOrderBy_Birthdate_Desc();
cb.paging(20, currentPageNumber);
cb.enablePagingCountLeastJoin();
...

逆に局所的に結合の最小限化を抑制したい場合は、disablePagingCountLeastJoin() を呼び出します。

再検索はしない (NonReSelect)

enablePagingCountLater() を呼び出すことで、カウント検索を後に実行することができます。

メソッド仕様

引数は正の値

引数の pageSize, pageNumber には必ず正の値を入れます。0 や マイナス値が指定された場合、pageSize は例外ですが、pageNumber は 1 が指定されたときと同じ動きをします。pageNumber は、ユーザ入力値(指定値)である可能性が想定されるため(任意の値を指定される可能性があるため)、不用意に例外にしないようにしています。

複数回呼び出しは上書き

複数回、Paging を呼び出した場合は、最後に設定された値が有効(上書き)になります。

FetchFirst 設定を上書き

FetchFirst が設定がされている状態で、Paging を呼び出すと、FetchFirstの設定は無効になります。

その昔は、FetchFirst + FetchPage

その昔は、paging() はなく、fetchFirst() を呼び出した後に、fetchPage() というメソッドでページ番号を指定することでページングを指定していました。 その名残はまだありますが、paging() がサポートされている今では意識する必要は全くありません。