Funções agregadas do Hibernate
1. Visão geral
Funções agregadas do Hibernate calculate the final result using the property values of all objects satisfying the given query criteria.
Hibernate Query Language (HQL) oferece suporte a várias funções de agregação -min(), max(), sum(), avg(), and count() na instruçãoSELECT. Assim como qualquer outra palavra-chave SQL, o uso dessas funções não diferencia maiúsculas de minúsculas.
Neste tutorial rápido, vamos explorar como usá-los. Observe que nos exemplos abaixo usamos os tipos primitivo ou wrapper para armazenar o resultado de funções agregadas. HQL suporta ambos, então é uma questão de escolher qual usar.
2. Configuração inicial
Vamos começar definindo uma entidadeStudent:
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long studentId;
private String name;
private int age;
// constructor, getters and setters
}
E preenchendo nosso banco de dados com alguns alunos:
public class AggregateFunctionsIntegrationTest {
private static Session session;
private static Transaction transaction;
@BeforeClass
public static final void setup() throws HibernateException, IOException {
session = HibernateUtil.getSessionFactory()
.openSession();
transaction = session.beginTransaction();
session.save(new Student("Jonas", 22, 12f));
session.save(new Student("Sally", 20, 34f));
session.save(new Student("Simon", 25, 45f));
session.save(new Student("Raven", 21, 43f));
session.save(new Student("Sam", 23, 33f));
}
}
Observe que nosso campostudentId foi preenchido usando a estratégia de geraçãoSEQUENCE.
Podemos aprender mais sobre isso em nosso tutorial emHibernate Identifier Generation Strategies.
3. min()
Agora, suponha que desejamos encontrar a idade mínima entre todos os alunos armazenados em nossa tabelaStudent. Podemos fazer isso facilmente usando a funçãomin():
@Test
public void whenMinAge_ThenReturnValue() {
int minAge = (int) session.createQuery("SELECT min(age) from Student")
.getSingleResult();
assertThat(minAge).isEqualTo(20);
}
ThegetSingleResult() method returns an Object type. Portanto, reduzimos a saída para umint.
4. max()
Semelhante à funçãomin(), temos uma funçãomax():
@Test
public void whenMaxAge_ThenReturnValue() {
int maxAge = (int) session.createQuery("SELECT max(age) from Student")
.getSingleResult();
assertThat(maxAge).isEqualTo(25);
}
Aqui, novamente, o resultado é reduzido para um tipoint.
The min() and max() functions' return type depends on the field in the context. Para nós, ele está retornando um número inteiro, já queStudent’s age é um atributo de tipoint.
5. sum()
Podemos usar a funçãosum() para encontrar a soma de todas as idades:
@Test
public void whenSumOfAllAges_ThenReturnValue() {
Long sumOfAllAges = (Long) session.createQuery("SELECT sum(age) from Student")
.getSingleResult();
assertThat(sumOfAllAges).isEqualTo(111);
}
Dependendo do tipo de dados do campo,the sum() function returns either a Long or a Double.
6. avg()
Da mesma forma, podemos usar a funçãoavg() para encontrar a idade média:
@Test
public void whenAverageAge_ThenReturnValue() {
Double avgAge = (Double) session.createQuery("SELECT avg(age) from Student")
.getSingleResult();
assertThat(avgAge).isEqualTo(22.2);
}
A funçãoavg() sempre retorna um valorDouble.
7. count()
Como no SQL nativo, o HQL também fornece uma funçãocount(). Vamos encontrar o número de registros em nossa tabelaStudent:
@Test
public void whenCountAll_ThenReturnValue() {
Long totalStudents = (Long) session.createQuery("SELECT count(*) from Student")
.getSingleResult();
assertThat(totalStudents).isEqualTo(5);
}
A funçãocount() retorna um tipoLong.
Podemos usar qualquer uma das variações disponíveis da funçãocount() -count(), count(…),count(distinct …), oucount(all …). * Cada um deles é semanticamente equivalente a sua contraparte SQL nativa.
8. Conclusão
Neste tutorial, abordamos brevemente os tipos de funções agregadas disponíveis no Hibernate. As funções agregadas do Hibernate são semelhantes às disponíveis no SQL antigo.
Como de costume, o código-fonte completo está disponívelover on Github.