Рубрики
Без рубрики

Агрегатные Функции Гибернации

Изучите совокупные функции, доступные в режиме гибернации.

Автор оригинала: 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 .