Lucrul cu Pagini: LIMIT și OFFSET
Foarte des, datele dintr-o bază de date sunt preluate în „pagini”. Pentru că așa este convenabil să lucrezi cu liste mari. Mai întâi interogăm rândurile de la 1 la 20, apoi de la 21 la 40 și așa mai departe.
Aceasta este o situație atât de comună încât SQL are operatori speciali pentru acest LIMIT și OFFSET.
Analogii acestor operatori sunt de asemenea prezenți în Hibernate. Doar ei au decis imediat să le facă sub formă de metode separate:
- setFirstResult() este analog cu OFFSET .
- setMaxResults() este analog cu LIMIT .
Scrierea interogărilor folosind aceste metode este foarte ușoară. Să scriem o interogare în care solicităm să returnăm 20 de sarcini începând de la 41. Iată cum va arăta:
Query<EmployeeTask> query = session.createQuery( “from EmployeeTask”, EmployeeTask.class);
query.setFirstResult(41);
query.setMaxResults(20);
List<EmployeeTask> resultLIst = query.list();
Sortați rezultatele
Ne-am dat seama cum să obținem o parte din șirurile de rezultate ale unei interogări. Următoarea problemă presantă este sortarea.
Sortarea în Hibernate este scrisă direct în interogarea HQL și arată în general de așteptat:
from Employee order by joinDate
Dacă doriți să schimbați ordinea de sortare, atunci trebuie să utilizați cuvinte familiare: asc și desc. Exemplu:
from Employee order by joinDate desc
La fel ca în SQL, puteți sorta după mai multe câmpuri:
from Employee order by joinDate desc, name asc
În plus, câmpul de sortare poate fi transmis ca parametru:
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();
Funcții în HQL
La fel ca în SQL în HQL, puteți utiliza diverse funcții.
Iată o listă de funcții agregate pe care HQL le acceptă:
Funcții agregate | Descriere |
---|---|
numara() | Returnează numărul de rânduri |
sumă() | Calculează suma valorilor |
min() | Returnează valoarea minimă |
max() | Returnează valoarea maximă |
medie() | Returnează media |
După cum sperăm să vă amintiți, funcțiile agregate sunt cele care pot fi utilizate împreună cu gruparea prin. Group By funcționează exact la fel ca în SQL, așa că nu ne vom repeta.
Și, desigur, funcțiile obișnuite . Cu funcțiile obișnuite, totul este mult mai simplu - sunt realizate de serverul SQL, Hibernate trebuie doar să genereze corect o interogare folosindu-le.
Prin urmare, Hibernate acceptă toate caracteristicile pe care le acceptă SQL Server. Iar tipul serverului SQL este setat de parametrul sqlDialect atunci când configurați SessionFactory.
Să găsim numărul de sarcini atribuite unui utilizator:
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