JavaRush /Курсы /Модуль 4. Работа с БД /Ограничение длины запроса

Ограничение длины запроса

Модуль 4. Работа с БД
10 уровень , 4 лекция
Открыта

Работа со страницами: 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();
1
Задача
Модуль 4. Работа с БД, 10 уровень, 4 лекция
Недоступна
task1008
В методе getSorted получи сессию из MySessionFactory.getSessionFactory(). Напиши запрос на hql для получения списка Employee отсортированных...
1
Задача
Модуль 4. Работа с БД, 10 уровень, 4 лекция
Недоступна
task1009
В методе getSalaryFund получи сессию из MySessionFactory.getSessionFactory()...
Комментарии (9)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Konstantin Уровень 90
24 октября 2025
Вот список агрегатных функций, которые поддерживает HQL: Агрегатные функции Описание count() Возвращает количество строк sum() Считает сумму значений min() Возвращает минимальное значение max() Возвращает максимальное значение avg() Возвращает среднее значение Как ты, надеюсь, помнишь, агрегатные функции, – это те, которые можно использовать вместе с group by. Group By работает точно так же, как в SQL, поэтому повторяться не будем. SELECT AVG(budget) as avg_budget, MAX(budget) as max_budget, MIN(budget) as min_budget, COUNT(*) as campaign_count FROM campaigns WHERE status = 'active'; -- этот запрос показывает, что агрегатные функции описанные выше не только с Group By работают, либо автор не то имел ввиду??
Даниил Уровень 92 Expert
6 ноября 2023
It doesn't work 'String hql = "from EmployeeTask where employee.name = :username order by :ord";' Not supported, input parameters are only allowed in the WHERE and HAVING clauses and you cannot use parameters for the ORDER BY clause. Or if I rephrase, you can't use parameters for columns, only values. So, either: Have as much named queries as possible sort orders Concatenate the ordering string to the query string Use criteria queries
Ольга Уровень 108 Expert
6 сентября 2023
Задача 1008: в условиях ограничения на отступ в 5 записей и лимит 10, а код диктует необходимость подстановки в качестве ограничения передаваемых в метод параметров. Задача принимается только, если подставить передаваемые параметры offset и limit
Вікторія Коваленко Уровень 108 Expert
12 января 2023
В первом примере, чтобы получить результат с 41 строки, нужно пропустить 40. А вот так:

query.setFirstResult(41);
результат будет начинаться с 42.
Александр Уровень 111 Expert
10 января 2023
На оф. документации хибернейта указано, что для агрегатных функций также как и в обычном sql используется GROUP BY. Тут в решении его нет, кому верить? :)
Станислав Future Уровень 39
25 апреля 2023
Указана count(*), значит считаем просто все строки подряд. Групповые функции позволяют вычислять итоговые значения по всей таблице. Для этого после ключевого слова SELECT указывается групповая функция для выражения или имени столбца, а ключевые слова GROUP BY опускаются.
Stas S Уровень 108 Expert
29 ноября 2022
task1008 - исправьте либо условие, либо тесты на валидацию задачи В условии числа 5 и 10, в правильном решении - 3 и 5
Антон Уровень 108 Expert
14 января 2023
На момент январь 2023 г. в правильном решении остаются 3 и 5, но тесты поправили - валидатор принимает 5 и 10, как в условии
Владимир Уровень 108
30 мая 2023
у меня не принял 5 и 10 только через параметры метода. что и првильнее