java - mvc - jpa pagination
HQL-identificador de fila para la paginaciĆ³n (3)
¿Alguien sabe si HQL tiene una palabra clave para identificar filas como ROWID o ROWNUM?
Me gustaría implementar la paginación con HQL, pero no puedo usar .setMaxResult () o .setFirstResult () porque no trabajo directamente con el objeto de sesión y, por lo tanto, no utilizo el objeto Query sino que simplemente creo mi consulta como una cadena y usa el método .find ().
Intenté usar LIMIT y OFFSET en mi consulta, pero HQL parece estar ignorando estas palabras clave y me está devolviendo el resultado sin importar nada.
Tampoco puedo usar los criterios de Hibernate porque no tiene soporte para la cláusula "HAVING" que aparece en mi consulta.
Mi último recurso es restringir el conjunto de resultados utilizando la palabra clave ROWNUM / ROWID. ¿Alguien más tiene alguna otra sugerencia?
Bueno, en principio puede acceder a ROWNUM / ROWID desde HSQL (aunque nunca lo he usado). Ver, por ejemplo, el blog de Ron . Eso debería funcionar.
Pero me gustaría señalar que realmente está trabajando en contra de Hibernate y HSQL si lo hace así. La forma correcta es usar setMaxResult () & friends. Si no puede hacer ese b / c de su arquitectura, al menos reconsideraría mis decisiones arquitectónicas. Sé que estos son siempre cambios difíciles de hacer, pero podría valer la pena.
esta es una situación en la que hibernate brilla:
solución típica con consulta hql.
int elementsPerBlock = 10;
int page = 2;
return getSession().createQuery("from SomeItems order by id asc")
.setFirstResult(elementsPerBlock * (page-1) + 1 )
.setMaxResults(elementsPerBlock)
.list();
hibernate traducirá esto a un patrón que la base de datos entiende por su dialecto sql. en Oracle creará una subselección con ROWNUM <X. en postgresql emitirá un LIMIT / OFFSET en el servidor msSQL emitirá un TOP.
que yo sepa, no es posible lograr esto con hql "puro".
Paginación usando la interfaz de consulta:
Hay dos métodos de la interfaz de consulta para la paginación.
1. Query setFirstResult (int startPosition): este método toma un entero que representa la primera fila en su conjunto de resultados, comenzando con la fila 0.
2. Query setMaxResults (int maxResult): este método le dice a Hibernate que recupere un número fijo maxResults de objetos. Usando los dos métodos anteriores juntos, podemos construir un componente de búsqueda en nuestra aplicación web o Swing.
Ejemplo:
Query query = session.createQuery("FROM Employee");
query.setFirstResult(5);
query.setMaxResults(10);
List<Employee> list = query.list();
for(Employee emp: list) {
System.out.println(emp);
}
Paginación utilizando la interfaz Criteria: hay dos métodos de la interfaz Criteria para la paginación.
1. Criterios setFirstResult (int firstResult):
Establezca el primer resultado que se recuperará.
2. Elemento de la lista Criterios setMaxResults (int maxResults):
Establezca un límite sobre la cantidad de objetos que se recuperarán.
Ejemplo:
Criteria criteria = session.createCriteria(Employee.class);
criteria.setFirstResult(5);
criteria.setMaxResults(10);
List<Employee> list = criteria.list();
for(Employee emp: list) {
System.out.println(emp);
}