Автор оригинала: Shubhra Srivastava.
1. Обзор
Агрегатные функции гибернации вычисляют конечный результат, используя значения свойств всех объектов, удовлетворяющих заданным критериям запроса.
Язык запросов Hibernate (HQL) поддерживает различные агрегатные функции – min(), max(), sum(), avg () и count() в инструкции SELECT . Как и любое другое ключевое слово SQL, использование этих функций не зависит от регистра.
В этом кратком руководстве мы рассмотрим, как их использовать. Пожалуйста, обратите внимание, что в приведенных ниже примерах мы используем типы примитивов или оболочек для хранения результатов агрегатных функций. HQL поддерживает и то, и другое, поэтому вопрос в том, какой из них использовать.
2. Начальная настройка
Давайте начнем с определения сущности Студент :
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private long studentId;
private String name;
private int age;
// constructor, getters and setters
}И заполнение нашей базы данных некоторыми студентами:
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));
}
}Обратите внимание, что наше поле студенческий билет было заполнено с использованием стратегии ПОСЛЕДОВАТЕЛЬНОСТИ генерации.
Мы можем узнать больше об этом в нашем руководстве по стратегиям генерации идентификаторов гибернации .
3. мин()
Теперь предположим, что мы хотим найти минимальный возраст среди всех студентов, хранящихся в нашей таблице Студент . Мы можем легко сделать это с помощью функции min() :
@Test
public void whenMinAge_ThenReturnValue() {
int minAge = (int) session.createQuery("SELECT min(age) from Student")
.getSingleResult();
assertThat(minAge).isEqualTo(20);
}Метод getSingleResult() возвращает тип объекта . Итак, мы сократили вывод до int .
4. макс()
Аналогично функции main () , у нас есть функция max() :
@Test
public void whenMaxAge_ThenReturnValue() {
int maxAge = (int) session.createQuery("SELECT max(age) from Student")
.getSingleResult();
assertThat(maxAge).isEqualTo(25);
}Здесь снова результат преобразуется в тип int .
Тип возвращаемых функций min() и max() зависит от поля в контексте . Для нас это возвращает целое число, так как Возраст студента является атрибутом int type.
5. сумма()
Мы можем использовать функцию sum () , чтобы найти сумму всех возрастов:
@Test
public void whenSumOfAllAges_ThenReturnValue() {
Long sumOfAllAges = (Long) session.createQuery("SELECT sum(age) from Student")
.getSingleResult();
assertThat(sumOfAllAges).isEqualTo(111);
}В зависимости от типа данных поля функция sum() возвращает либо Длинный , либо Двойной .
6. среднее значение()
Аналогично, мы можем использовать функцию avg() для определения среднего возраста:
@Test
public void whenAverageAge_ThenReturnValue() {
Double avgAge = (Double) session.createQuery("SELECT avg(age) from Student")
.getSingleResult();
assertThat(avgAge).isEqualTo(22.2);
}То среднее значение() функция всегда возвращает Двойной ценность.
7. подсчет()
Как и в собственном SQL, HQL также предоставляет функцию count () . Давайте найдем количество записей в нашей таблице Студент :
@Test
public void whenCountAll_ThenReturnValue() {
Long totalStudents = (Long) session.createQuery("SELECT count(*) from Student")
.getSingleResult();
assertThat(totalStudents).isEqualTo(5);
}То количество() функция возвращает Длинный тип.
Мы можем использовать любые доступные варианты функции count () – |/count(*), count(…), count(отдельный …), или count(все …) . Каждый из них семантически эквивалентен своему собственному аналогу SQL.
8. Заключение
В этом руководстве мы кратко рассмотрели типы агрегатных функций, доступных в Hibernate. Агрегатные функции Hibernate аналогичны функциям, доступным в обычном старом SQL.
Как обычно, полный исходный код доступен на GitHub .