Работа со страницами: 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();
undefined
1
Задача
Модуль 4. Работа с БД, 10 уровень, 4 лекция
Недоступна
task1008
В методе getSorted получи сессию из MySessionFactory.getSessionFactory(). Напиши запрос на hql для получения списка Employee отсортированных...
undefined
1
Задача
Модуль 4. Работа с БД, 10 уровень, 4 лекция
Недоступна
task1009
В методе getSalaryFund получи сессию из MySessionFactory.getSessionFactory()...