2009-10-21 14 views
8

¿Cómo implemento la paginación en Hibernate? Los objetos Query tienen métodos llamados setMaxResults y setFirstResult que sin duda son útiles. Pero, ¿dónde puedo obtener el número total de resultados, para poder mostrar el enlace a la última página de resultados e imprimir cosas como los resultados 200 a 250 de xxx?Implementación de la paginación de resultados en hibernación (obtención del número total de filas)

+1

Estoy de acuerdo con las otras dos respuestas. Además, solicito prácticas de implementación en esta publicación: http://stackoverflow.com/questions/1600440/java-coding-best-practices-for-reusing-part-of-a-query-to-count – KLE

Respuesta

12

Puede usar Query.setMaxResults (int results) y Query.setFirstResult (int offset).

Edición también: no hay forma de saber cuántos resultados obtendrá. Entonces, primero debe consultar con "seleccionar conteo (*) ...". Un poco feo, en mi humilde opinión.

1

podría realizar dos consultas: una consulta de tipo de conteo (*), que debería ser barata si no está uniendo demasiadas tablas, y una segunda consulta que tiene los límites establecidos. Entonces sabrá cuántos artículos existen, pero solo captará los que se están viendo.

-2

Personalmente, creo que debe manejar la paginación en el front-end. Sé que esto no es tan eficiente, pero al menos sería menos propenso a errores.

Si usara el recuento (*) ¿qué pasaría si los registros se eliminan de la tabla entre las solicitudes de una página determinada? Muchas cosas podrían salir mal de esta manera.

+0

I no pienses que es crítico. Si los registros se eliminan ** y ** puede navegar por las últimas páginas, recibirá un error más un enlace a los últimos registros existentes. O algo similar. – flybywire

+3

hay problemas con la búsqueda en el frente si la cantidad de datos es prohibitivamente grande, digamos, 1 millón de registros o algo así. – Chii

7

Debe realizar una consulta por separado para obtener los resultados máximos ... y en el caso donde entre el tiempo A de la primera vez que el cliente emite una solicitud de paginación al tiempo B cuando se emite otra solicitud, si se agregan nuevos registros o algunos registros ahora se ajustan a los criterios, entonces debe consultar nuevamente el máximo para reflejarlos. Yo suelo hacer esto en HQL como esto

Integer count = (Integer) session.createQuery("select count(*) from ....").uniqueResult(); 

para Criteria consultas por lo general empujo mis datos en un DTO como esto

ScrollableResults scrollable = criteria.scroll(ScrollMode.SCROLL_INSENSITIVE); 
if(scrollable.last()){//returns true if there is a resultset 
    genericDTO.setTotalCount(scrollable.getRowNumber() + 1); 
    criteria.setFirstResult(command.getStart()) 
      .setMaxResults(command.getLimit()); 
    genericDTO.setLineItems(Collections.unmodifiableList(criteria.list())); 
} 
scrollable.close(); 
return genericDTO; 
0

Puede setMaxResults sólo al número máximo de filas que desea obtener. No hay daño al establecer este valor mayor que el número de filas reales disponibles. El problema de las otras soluciones es que suponen que el orden de los registros sigue siendo el mismo en cada repetición de la consulta, y no hay cambios entre los comandos.

Para evitar eso, si realmente desea desplazarse por los resultados, lo mejor es utilizar los resultados de desplazamiento. No arroje este objeto entre paginación, pero utilícelo para mantener los registros en el mismo orden. Para saber la cantidad de registros de ScrollableResults, puede simplemente pasar a la última posición() y luego obtener el número de fila. Recuerde agregar 1 a este valor, ya que los números de fila comienzan a contar en 0.

Cuestiones relacionadas