Работа със страници: 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 Ivanович”);
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 Ivanович”);
Integer count = query.uniqueResult();
GO TO FULL VERSION