hibernate と displaytag を使用してクエリ結果のページネーションを実行しようとしていますが、HibernateDetachedCriteria
オブジェクトが邪魔をしようと最善を尽くしています。説明させてください...
displaytag でページネーションを行う最も簡単な方法PaginatedList
は、特に次のメソッドを持つインターフェイスを実装することです。
/* Gets the total number of results. */
int getFullListSize();
/* Gets the current page of results. */
List getList();
/* Gets the page size. */
int getObjectsPerPage();
/* Gets the current page number. */
int getPageNumber();
/* Get the sorting column and direction */
String getSortCriterion();
SortOrderEnum getSortDirection();
PaginatedList の実装に Criteria オブジェクトを投げて、これらの線に沿って動作させることを考えています...
getFullListSize() {
criteria.setProjection(Projections.rowCount());
return ((Long) criteria.uniqueResult()).intValue();
}
getList() {
if (getSortDirection() == SortOrderEnum.ASCENDING) {
criteria.addOrder(Order.asc(getSortCriterion());
} else if (getSortDirection() == SortOrderEnum.DECENDING) {
criteria.addOrder(Order.desc(getSortCriterion());
}
return criteria.list((getPageNumber() - 1) * getObjectsPerPage(),
getObjectsPerPage());
}
しかし、これは機能しません。これは、addOrder()
または のsetProjection()
呼び出しによって条件オブジェクトが変更され、後続の呼び出しで使用できなくなるためです。呼び出しの順序は完全にはわかりませんが、データベースはgetFullListSize()
" " を実行しようとするとエラーをスローしますが、select count(*) ... order by ...
これは明らかに間違っています。
独自のオブジェクトを作成してクエリ条件を追跡し、呼び出しごとに Criteria オブジェクトを再構築することでこれを修正できると思いますが、それはさらに別の車輪を再発明するように感じます. おそらく最初に渡された基準をコピーし、そのコピーで作業する、よりスマートな方法はありますか?
更新getList
:最初に呼び出さように見えるgetFullListSize
ため、順序が渡されるとすぐにgetFullListSize
失敗します。オブジェクトをコピー/リセットする必要なく、データベースに1回だけアクセスして(getList
私が言うには)結果をキャッシュするCriteria
ますが、それでも...
更新 (再度) : それは忘れてcount
くださいselect
。本当に 2 つの異なるCriteria
オブジェクトが必要です。