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