Implementación de paginación de resultados en hibernación (obteniendo el número total de filas)

StackOverflow https://stackoverflow.com/questions/1600215

Pregunta

¿Cómo implemento la paginación en Hibernate? Los Consulta tiene objetos 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 ?

¿Fue útil?

Solución

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

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

Otros consejos

Debe hacer una consulta separada para obtener los resultados máximos ... y en el caso de que entre el momento A de la primera vez que el cliente emita una solicitud de paginación a la hora B cuando se emita otra solicitud, si se agregan nuevos registros o algunos registros ahora se ajustan a los criterios, entonces debe consultar el máximo nuevamente para reflejarlos Normalmente hago esto en HQL como este

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

para consultas de Criterios Normalmente inserto mis datos en un DTO como este

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;

puede realizar dos consultas: una consulta de tipo de cuenta (*), que debería ser barata si no está uniendo demasiadas tablas juntas, y una segunda consulta que tiene los límites establecidos. Entonces sabes cuántos elementos existen, pero solo toma los que se están viendo.

Puede establecer MaxResults en el número máximo de filas que desea devolver. No hay ningún daño en 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 cada vez que se repite la consulta, y no hay cambios entre los comandos.

Para evitar eso si realmente desea desplazarse por los resultados, es mejor usar los Resultados de desplazamiento. No tire este objeto entre paginación, pero úselo para mantener los registros en el mismo orden. Para averiguar el número de registros de ScrollableResults, simplemente puede moverse 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.

Personalmente, creo que deberías 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 usaría la cosa count (*), ¿qué pasaría si los registros se eliminan de la tabla entre solicitudes para una página determinada? Muchas cosas podrían salir mal de esta manera.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top