Estoy tratando de hacer una consulta de paginación de resultados con hibernación y displaytag, y los objetos Hibernate DetachedCriteria
están haciendo su mejor esfuerzo para interponerse en el camino. Me explico ...¿Cómo reutilizar un objeto Criteria con hibernación?
La manera más fácil de hacer con la paginación displaytag parece estar implementando la interfaz PaginatedList
que tiene, entre otros, los siguientes métodos:
/* 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();
estoy pensando en tirar mi PaginatedList la implementación de un objeto Criteria y dejar actuar a lo largo de las líneas 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());
}
Pero esto no funciona, porque los addOrder()
o las llamadas setProjection()
modificar los criterios objeto que lo hacen i n-utilizable para las llamadas sucesivas. No estoy del todo seguro del orden de las llamadas, pero el archivo db arroja un error en getFullListSize()
tratando de hacer un "select count(*) ... order by ...
" que obviamente está mal.
Creo que podría solucionar esto creando un objeto propio para realizar un seguimiento de las condiciones de la consulta y reconstruir el objeto Criteria para cada llamada, pero parece reinventar otra rueda. ¿Hay alguna manera más inteligente, posiblemente copiando los Criterios que inicialmente pasaron y trabajando en esa copia?
actualización: Parece que getList
se llama primero, y getFullListSize
se llama varias veces después, por lo que, tan pronto como hay una ordenación aprobada en, getFullListSize
fallará. No tendría sentido para golpear el PP sólo una vez (en getList
diría) y almacenar en caché los resultados, sin necesidad de copiar/restaurar el objeto Criteria
, pero aún así ...
actualización (de nuevo): Olvídate de eso, una vez que he hecho el count
no puedo hacer el select
, y viceversa. Realmente necesito dos objetos distintos Criteria
.
Encontré esa sugerencia en los foros de hibernación, pero preferiría no :-) – agnul