1. Робота зі сторінками: LIMIT та OFFSET

Дуже часто інформація з бази даних витягується сторінками. Тому що саме так зручно працювати із великими списками. Спочатку зробимо запит на рядки з 1 до 20, потім з 21 до 40 і так далі.

Це настільки поширена ситуація, що в SQL з'явилися спеціальні оператори для цього — LIMIT та OFFSET.

Аналоги цих операторів є і в Hibernate. Тільки їх одразу вирішили зробити у вигляді окремих методів:

  • setFirstResult() — аналог OFFSET.
  • setMaxResults() — аналог LIMIT.

Писати запити з цими методами дуже просто. Давай напишемо запит, де попросимо повернути 20 завдань, починаючи з 41. Ось як це виглядатиме:


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

2. Сортування результатів

Як отримувати частину рядків результату запиту, ми розібралися. Наступне питання — сортування.

Сортування в Hibernate пишеться прямо в HQL-запиті і виглядає загалом очікувано:


from Employee order by joinDate

Якщо ти хочеш змінити порядок сортування, потрібно використовувати знайомі слова: asc і desc. Приклад:


from Employee order by joinDate desc

Так само, як і в SQL, ти можеш сортувати за кількома полями:


from Employee order by joinDate desc, name asc

До того ж, поле для сортування можна передати як параметр:


           String hql = "з EmployeeTask where employee.name = :username order by :ord";
           Query<EmployeeTask> query = session.createQuery( hql, EmployeeTask.class);
           query.setParameter("username", "Іван Іванович");
           query.setParameter(“ord”, “name”);
 
           List<EmployeeTask> resultLIst = query.list();

3. Функції в HQL

Так само, як і в SQL у HQL, можна використовувати різні функції.

Ось список агрегатних функцій, які підтримує HQL:

Агрегатні функції Опис
count() Повертає кількість рядків
sum() Рахує суму значень
min() Повертає мінімальне значення
max() Повертає максимальне значення
avg() Повертає середнє значення

Як ти, сподіваюся, пам'ятаєш, агрегатні функції — це ті, які можна використовувати разом із group by. Group By працює так само, як у SQL, тому повторюватися не будемо.

Ну і, звісно, звичайні функції. Зі звичайними функціями все набагато простіше — їх виконує SQL-сервер, Hibernate потрібно лише правильно згенерувати запит з їх використанням.

Тому Hibernate підтримує всі функції, які підтримує SQL-сервер. А тип SQL-сервера встановлюється параметром sqlDialect, коли конфігуруєш свій SessionFactory.

Давай знайдемо кількість завдань, призначених для користувача:


           String hql = "select count(*) from EmployeeTask where employee.name = :username ";
           Query<Integer> query = session.createQuery( hql, Integer.class);
           query.setParameter("username", "Іван Іванович");
           Integer count = query.uniqueResult();