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();