Arbeide med sider: LIMIT og OFFSET

Svært ofte hentes data fra en database i "sider". For det er slik det er praktisk å jobbe med store lister. Vi spør først rad 1 til 20, deretter 21 til 40, og så videre.

Dette er en så vanlig situasjon at SQL har spesielle operatører for denne LIMIT og OFFSET.

Analoger av disse operatørene finnes også i Hibernate. Bare de bestemte seg umiddelbart for å lage dem i form av separate metoder:

  • setFirstResult() er analog med OFFSET .
  • setMaxResults() er analog med LIMIT .

Det er veldig enkelt å skrive spørsmål ved hjelp av disse metodene. La oss skrive en spørring hvor vi ber om å returnere 20 oppgaver fra og med 41. Slik vil det se ut:

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

Sorter resultater

Vi fant ut hvordan vi kan få en del av resultatstrengene til en spørring. Det neste presserende problemet er sortering.

Sortering i Hibernate skrives direkte i HQL-spørringen og ser generelt forventet ut:

from Employee order by joinDate

Hvis du vil endre sorteringsrekkefølgen, må du bruke kjente ord: asc og desc. Eksempel:

from Employee order by joinDate desc

Akkurat som i SQL, kan du sortere etter flere felt:

from Employee order by joinDate desc, name asc

I tillegg kan sorteringsfeltet sendes som en parameter:

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

Funksjoner i HQL

Akkurat som i SQL i HQL kan du bruke ulike funksjoner.

Her er en liste over samlede funksjoner som HQL støtter:

Aggregerte funksjoner Beskrivelse
telle() Returnerer antall rader
sum() Beregner summen av verdier
min() Returnerer minimumsverdien
maks() Returnerer maksimumsverdien
avg() Returnerer gjennomsnittet

Som du forhåpentligvis husker, er aggregerte funksjoner de som kan brukes sammen med gruppe etter. Group By fungerer akkurat det samme som i SQL, så vi vil ikke gjenta oss selv.

Og selvfølgelig de vanlige funksjonene . Med vanlige funksjoner er alt mye enklere - de utføres av SQL-serveren, Hibernate trenger bare å generere en spørring ved å bruke dem.

Derfor støtter Hibernate alle funksjonene som SQL Server støtter. Og typen SQL-server angis av sqlDialect-parameteren når du konfigurerer SessionFactory.

La oss finne antall oppgaver som er tildelt en bruker:

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