Trabajar con páginas: LÍMITE y DESPLAZAMIENTO

Muy a menudo, los datos de una base de datos se recuperan en "páginas". Porque así es conveniente trabajar con listas grandes. Primero consultamos las filas 1 a 20, luego 21 a 40, y así sucesivamente.

Esta es una situación tan común que SQL tiene operadores especiales para este LÍMITE y DESPLAZAMIENTO.

Los análogos de estos operadores también están presentes en Hibernate. Solo que inmediatamente decidieron hacerlos en forma de métodos separados:

  • setFirstResult() es análogo a OFFSET .
  • setMaxResults() es análogo a LIMIT .

Escribir consultas usando estos métodos es muy fácil. Escribamos una consulta en la que solicitemos devolver 20 tareas a partir de 41. Así es como se verá:

Query<EmployeeTask> query = session.createQuery( “from EmployeeTask, EmployeeTask.class);
query.setFirstResult(41);
query.setMaxResults(20);
List<EmployeeTask> resultLIst = query.list();

Ordenar resultados

Descubrimos cómo obtener parte de las cadenas de resultados de una consulta. El siguiente problema apremiante es la clasificación.

La clasificación en Hibernate se escribe directamente en la consulta HQL y generalmente se ve como se espera:

from Employee order by joinDate

Si desea cambiar el orden de clasificación, debe usar palabras familiares: asc y desc. Ejemplo:

from Employee order by joinDate desc

Al igual que en SQL, puede ordenar por varios campos:

from Employee order by joinDate desc, name asc

Además, el campo de clasificación se puede pasar como un parámetro:

String hql = "from EmployeeTask where employee.name = :username order by :ord";
Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
query.setParameter(“username”, “Ivan Ivanovich”);
query.setParameter(“ord”, “name”);

List<EmployeeTask> resultLIst = query.list();

Funciones en HQL

Al igual que en SQL en HQL, puede usar varias funciones.

Aquí hay una lista de funciones agregadas que admite HQL:

Funciones agregadas Descripción
contar() Devuelve el número de filas
suma() Calcula la suma de valores
min() Devuelve el valor mínimo
máx() Devuelve el valor máximo
promedio() Devuelve la media

Como recordará, las funciones agregadas son las que se pueden usar junto con group by. Agrupar por funciona exactamente igual que en SQL, por lo que no nos repetiremos.

Y, por supuesto, las funciones habituales . Con las funciones ordinarias, todo es mucho más simple: son realizadas por el servidor SQL, Hibernate solo necesita generar correctamente una consulta usándolas.

Por lo tanto, Hibernate admite todas las funciones que admite SQL Server. Y el tipo de servidor SQL se establece mediante el parámetro sqlDialect cuando configura su SessionFactory.

Encontremos el número de tareas asignadas a un usuario:

String hql = "select count(*) from EmployeeTask where employee.name = :username ";
Query<Integer> query = session.createQuery( hql, Integer.class);
query.setParameter(“username”, “Ivan Ivanovich”);
Integer count = query.uniqueResult();