Работа със страници: LIMIT и OFFSET

Много често данните от база данни се извличат в „страници“. Защото така е удобно да се работи с големи списъци. Първо правим заявка за редове от 1 до 20, след това от 21 до 40 и т.н.

Това е толкова често срещана ситуация, че SQL има специални оператори за тези LIMIT и OFFSET.

Аналози на тези оператори също присъстват в Hibernate. Само те веднага решиха да ги направят под формата на отделни методи:

  • setFirstResult() е аналогичен на OFFSET .
  • setMaxResults() е аналогичен на LIMIT .

Писането на заявки с помощта на тези методи е много лесно. Нека напишем заявка, в която искаме да върнем 20 задачи, започвайки от 41. Ето How ще изглежда:

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

Сортиране на резултатите

Разбрахме How да получим част от резултантните низове на заявка. Следващият належащ проблем е сортирането.

Сортирането в Hibernate е написано директно в HQL заявката и изглежда като цяло очаквано:

from Employee order by joinDate

Ако искате да промените реда на сортиране, тогава трябва да използвате познати думи: asc и desc. Пример:

from Employee order by joinDate desc

Точно Howто в 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”, “Ivan Ivanovich”);
query.setParameter(“ord”, “name”);

List<EmployeeTask> resultLIst = query.list();

Функции в HQL

Точно Howто в SQL в HQL можете да използвате различни функции.

Ето списък с агрегатни функции , които HQL поддържа:

Агрегатни функции Описание
броя() Връща броя на редовете
сума () Изчислява сумата от стойности
мин() Връща минималната стойност
макс () Връща максималната стойност
ср.() Връща средната стойност

Както се надяваме да си спомняте, агрегатните функции са тези, които могат да се използват заедно с group by. Group By работи точно Howто в SQL, така че няма да се повтаряме.

И, разбира се, обичайните функции . С обикновените функции всичко е много по-просто - те се изпълняват от SQL сървъра, Hibernate трябва само да генерира правилно заявка, използвайки ги.

Следователно Hibernate поддържа всички функции, поддържани от SQL Server. И типът на SQL сървъра се задава от параметъра sqlDialect, когато конфигурирате вашата SessionFactory.

Нека намерим броя на задачите, възложени на потребител:

String hql = "select count(*) from EmployeeTask where employee.name = :username ";
Query<Integer> query = session.createQuery( hql, Integer.class);
query.setParameter(“username”, “Ivan Ivanovich”);
Integer count = query.uniqueResult();