Trabalhando com páginas: LIMIT e OFFSET

Muitas vezes, os dados de um banco de dados são recuperados em “páginas”. Porque é assim que é conveniente trabalhar com listas grandes. Primeiro consultamos as linhas 1 a 20, depois 21 a 40 e assim por diante.

Esta é uma situação tão comum que o SQL possui operadores especiais para este LIMIT e OFFSET.

Análogos desses operadores também estão presentes no Hibernate. Só eles imediatamente decidiram fazê-los na forma de métodos separados:

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

Escrever consultas usando esses métodos é muito fácil. Vamos escrever uma consulta onde pedimos para retornar 20 tarefas a partir de 41. É assim que ficará:

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

Ordenar resultados

Descobrimos como obter parte das strings de resultado de uma consulta. A próxima questão urgente é a classificação.

A classificação no Hibernate é escrita diretamente na consulta HQL e parece geralmente esperada:

from Employee order by joinDate

Se você quiser alterar a ordem de classificação, precisará usar palavras familiares: asc e desc. Exemplo:

from Employee order by joinDate desc

Assim como no SQL, você pode classificar por vários campos:

from Employee order by joinDate desc, name asc

Além disso, o campo sort pode ser passado como 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();

Funções em HQL

Assim como no SQL em HQL, você pode usar várias funções.

Aqui está uma lista de funções agregadas que o HQL suporta:

funções agregadas Descrição
contar() Retorna o número de linhas
soma() Calcula a soma dos valores
min() Retorna o valor mínimo
max() Retorna o valor máximo
média() Retorna a média

Como você deve se lembrar, as funções de agregação são aquelas que podem ser usadas em conjunto com group by. Group By funciona exatamente da mesma forma que no SQL, então não vamos nos repetir.

E, claro, as funções usuais . Com funções comuns, tudo é muito mais simples - elas são executadas pelo servidor SQL, o Hibernate só precisa gerar uma consulta corretamente usando-as.

Portanto, o Hibernate suporta todos os recursos que o SQL Server suporta. E o tipo do servidor SQL é definido pelo parâmetro sqlDialect quando você configura sua SessionFactory.

Vamos encontrar o número de tarefas atribuídas a um usuário:

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();