我試圖做的查詢結果分頁與Hibernate和displaytag和Hibernate DetachedCriteria
對象正在盡最大努力在路上的絆腳石。讓我來解釋......如何在Hibernate中重用Criteria對象?
做分頁用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的實施標準的對象,讓它沿着theese線工作...
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()
通話修改的標準對象呈現它,我n可用於連續呼叫。我並不完全確定這些調用的順序,但db在嘗試執行「select count(*) ... order by ...
」的getFullListSize()
時會拋出一個錯誤,這顯然是錯誤的。
我覺得我可以創造我自己的目的是跟蹤的查詢條件和重建對象的標準爲每個呼叫解決這個問題,但感覺就像重新發明另一個輪子。有沒有更聰明的方法,可能會複製最初傳入並處理該副本的標準?
更新: 看起來getList
首先調用,getFullListSize
之後多次調用,所以,只要有傳入的排序,getFullListSize
將失敗。它將使意義擊中分貝只有一次(在getList
我說)和緩存結果,而無需複製/重置Criteria
對象,但仍...
更新(再次): 忘記的是,一旦我已經做了我count
不能做select
,反之亦然。我真的需要兩個截然不同的對象。
發現對hibernate論壇的建議,但我寧願不:-) – agnul 2008-12-16 09:05:37