Werken met pagina's: LIMIT en OFFSET

Heel vaak worden gegevens uit een database in “pagina’s” opgehaald. Want zo is het handig om met grote lijsten te werken. We doorzoeken eerst rijen 1 tot en met 20, vervolgens rijen 21 tot en met 40, enzovoort.

Dit komt zo vaak voor dat SQL speciale operatoren heeft voor LIMIT en OFFSET.

Analogen van deze operators zijn ook aanwezig in Hibernate. Alleen zij besloten onmiddellijk om ze in de vorm van afzonderlijke methoden te maken:

  • setFirstResult() is analoog aan OFFSET .
  • setMaxResults() is analoog aan LIMIT .

Query's schrijven met deze methoden is heel eenvoudig. Laten we een query schrijven waarin we vragen om 20 taken te retourneren vanaf 41. Dit is hoe het eruit zal zien:

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

Sorteer resultaten

We hebben ontdekt hoe we een deel van de resultaatstrings van een query kunnen krijgen. Het volgende dringende probleem is sorteren.

Sorteren in Hibernate wordt rechtstreeks in de HQL-query geschreven en ziet er algemeen verwacht uit:

from Employee order by joinDate

Als u de sorteervolgorde wilt wijzigen, moet u bekende woorden gebruiken: asc en desc. Voorbeeld:

from Employee order by joinDate desc

Net als in SQL kunt u sorteren op meerdere velden:

from Employee order by joinDate desc, name asc

Bovendien kan het sorteerveld als parameter worden doorgegeven:

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

Functies in HQL

Net als in SQL kun je in HQL verschillende functies gebruiken.

Hier is een lijst met geaggregeerde functies die HQL ondersteunt:

Geaggregeerde functies Beschrijving
graaf() Retourneert het aantal rijen
som() Berekent de som van waarden
minuten() Retourneert de minimumwaarde
maximum() Retourneert de maximale waarde
gemiddeld() Geeft het gemiddelde terug

Zoals u zich hopelijk herinnert, zijn aggregatiefuncties degene die kunnen worden gebruikt in combinatie met group by. Group By werkt precies hetzelfde als in SQL, dus we herhalen onszelf niet.

En natuurlijk de gebruikelijke functies . Met gewone functies is alles veel eenvoudiger - ze worden uitgevoerd door de SQL-server, Hibernate hoeft er alleen maar correct een query mee te genereren.

Daarom ondersteunt Hibernate alle functies die SQL Server ondersteunt. En het type van de SQL-server wordt ingesteld door de parameter sqlDialect wanneer u uw SessionFactory configureert.

Laten we het aantal taken vinden dat aan een gebruiker is toegewezen:

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