Работа со страницами: 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();
Сортировка результатов
Как получать часть строк результата запроса мы разобрались. Следующий насущный вопрос – сортировка.
Сортировка в 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 = "from 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();
Функции в 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();