Praca ze stronami: LIMIT i OFFSET
Bardzo często dane z bazy danych pobierane są w „stronach”. Ponieważ tak wygodnie jest pracować z dużymi listami. Najpierw sprawdzamy wiersze od 1 do 20, następnie od 21 do 40 i tak dalej.
Jest to tak powszechna sytuacja, że SQL ma specjalne operatory dla tego LIMIT i OFFSET.
Analogi tych operatorów są również obecne w Hibernate. Tylko oni od razu postanowili zrobić je w formie odrębnych metod:
- setFirstResult() jest analogiczne do OFFSET .
- setMaxResults() jest analogiczna do LIMIT .
Pisanie zapytań przy użyciu tych metod jest bardzo łatwe. Napiszmy zapytanie, w którym poprosimy o zwrócenie 20 zadań zaczynając od 41. Tak to będzie wyglądać:
Query<EmployeeTask> query = session.createQuery( “from EmployeeTask”, EmployeeTask.class);
query.setFirstResult(41);
query.setMaxResults(20);
List<EmployeeTask> resultLIst = query.list();
Sortuj wyniki
Wymyśliliśmy, jak uzyskać część ciągów wynikowych zapytania. Następną pilną kwestią jest sortowanie.
Sortowanie w Hibernate jest zapisywane bezpośrednio w zapytaniu HQL i ogólnie wygląda tak:
from Employee order by joinDate
Jeśli chcesz zmienić kolejność sortowania, musisz użyć znanych słów: asc i desc. Przykład:
from Employee order by joinDate desc
Podobnie jak w SQL, możesz sortować według wielu pól:
from Employee order by joinDate desc, name asc
Dodatkowo pole sortowania można przekazać jako parametr:
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();
Funkcje w HQL
Podobnie jak w SQL w HQL, możesz korzystać z różnych funkcji.
Oto lista funkcji agregujących obsługiwanych przez HQL:
Funkcje agregujące | Opis |
---|---|
liczyć() | Zwraca liczbę wierszy |
suma() | Oblicza sumę wartości |
min() | Zwraca wartość minimalną |
maks() | Zwraca wartość maksymalną |
średnia() | Zwraca średnią |
Jak zapewne pamiętasz, funkcje agregujące to te, których można używać w połączeniu z funkcją grupowania według. Group By działa dokładnie tak samo jak w SQL, więc nie będziemy się powtarzać.
I oczywiście zwykłe funkcje . Przy zwykłych funkcjach wszystko jest dużo prostsze - wykonuje je serwer SQL, Hibernate musi jedynie poprawnie wygenerować zapytanie z ich wykorzystaniem.
Dlatego Hibernate obsługuje wszystkie funkcje obsługiwane przez SQL Server. A typ serwera SQL jest ustawiany przez parametr sqlDialect podczas konfigurowania SessionFactory.
Znajdźmy liczbę zadań przypisanych do użytkownika:
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();
GO TO FULL VERSION