Ich versuche Abfrage Ergebnis Paginierung mit Hibernate und Displaytag zu tun, und Hibernate DetachedCriteria
Objekte tun ihr Bestes, um in die Quere kommen. Lassen Sie mich erklären ...Wie wird ein Criteria-Objekt mit Hibernate wiederverwendet?
Der einfachste Weg, Paginierung mit displaytag zu tun scheint die PaginatedList
Schnittstelle implementiert werden, die unter anderem hat die folgenden Methoden:
/* 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();
Ich denke, meine PaginatedList werfen Umsetzung ein Objekt Kriterien und es entlang ond Linien arbeiten lassen ...
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());
}
Aber das funktioniert nicht, weil die addOrder()
oder die setProjection()
Anrufe die Kriterien, die sie ändern Objekt-Rendering i n-verwendbar für die aufeinanderfolgenden Anrufe. Ich bin nicht ganz sicher über die Reihenfolge der Anrufe, aber die DB wirft einen Fehler auf getFullListSize()
versucht, eine "select count(*) ... order by ...
" zu tun, die offensichtlich falsch ist.
Ich denke, ich könnte das beheben, indem ich ein eigenes Objekt erstelle, um die Abfragebedingungen zu verfolgen und das Criteria-Objekt für jeden Aufruf neu aufzubauen, aber das hat das Gefühl, ein weiteres Rad neu zu erfinden. Gibt es einen klügeren Weg, möglicherweise die Kriterien zu kopieren, die ursprünglich übergeben wurden und an dieser Kopie arbeiteten?
aktualisieren: Es sieht aus wie getList
zuerst genannt wird, und getFullListSize
wird mehrmals nach, so, sobald es eine Ordnung in vergangen genannt wird getFullListSize
scheitern. Es wäre sinnvoll, die db zu treffen nur einmal (in getList
würde ich sagen) und die Ergebnisse zwischenzuspeichern, ohne die Notwendigkeit zu kopieren/Zurücksetzen des Criteria
Objekt, aber immer noch ...
Update (wieder): Vergiss das, sobald ich die count
gemacht habe, kann ich nicht die select
tun, und umgekehrt. Ich brauche wirklich zwei verschiedene Criteria
Objekte.
Diesen Vorschlag auf den Winterschlaf Foren gefunden, aber ich würde lieber nicht :-) – agnul