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();