Hibernate Pagination

1. Oversikt

Denne artikkelen er en rask introduksjon til Pagination in Hibernate. Vi vil se på både standard HQL og Rullbare resultater API, og til slutt ved paginering med Hibernate Criteria.

2. Paginering med HQL og setFirstResult,setMaxResults API

Den enkleste og vanligste måten å gjøre paginering på i dvale er bruker HQL:

Sessionsøkt = sessionFactory.openSession (); Query query = sess.createQuery ("From Foo"); query.setFirstResult (0); query.setMaxResults (10); Liste fooList = fooList = query.list ();

Dette eksemplet bruker en grunnleggende Foo enhet og er veldig lik JPA med JQL-implementering - den eneste forskjellen er spørringsspråket.

Hvis vi slår på logging for dvalemodus, ser vi følgende SQL kjøres:

Dvalemodus: velg foo0_.id som id1_1_, foo0_.name som name2_1_ fra Foo foo0_ limit?

2.1. Det totale antallet og den siste siden

En paginasjonsløsning er ikke komplett uten å vite det totale antallet enheter:

String countQ = "Velg count (f.id) fra Foo f"; Query countQuery = session.createQuery (countQ); Lange countResults = (Long) countQuery.uniqueResult ();

Og til slutt, fra totalt antall og en gitt sidestørrelse, kan vi beregne den siste siden:

int pageSize = 10; int lastPageNumber = (int) (Math.ceil (countResults / pageSize));

På dette punktet kan vi se på et komplett eksempel for paginering, hvor vi beregner den siste siden og deretter henter den:

@Test offentlig ugyldig givenEntitiesExist_whenRetrievingLastPage_thenCorrectSize () {int pageSize = 10; String countQ = "Velg count (f.id) fra Foo f"; Query countQuery = session.createQuery (countQ); Lange countResults = (Long) countQuery.uniqueResult (); int lastPageNumber = (int) (Math.ceil (countResults / pageSize)); Query selectQuery = session.createQuery ("Fra Foo"); selectQuery.setFirstResult ((lastPageNumber - 1) * pageSize); selectQuery.setMaxResults (pageSize); Liste lastPage = selectQuery.list (); assertThat (lastPage, hasSize (lessThan (pageSize + 1))); }

3. Paginering med dvale ved hjelp av HQL og ScrollableResults API

Ved hjelp av ScrollableResults for å implementere paginering har potensialet til redusere databasesamtaler. Denne tilnærmingen strømmer resultatsettet når programmet blar gjennom det, og eliminerer derfor behovet for å gjenta spørringen for å fylle hver side:

String hql = "FROM Foo f order by f.name"; Spørringsspørsmål = session.createQuery (hql); int pageSize = 10; ScrollableResults resultScroll = query.scroll (ScrollMode.FORWARD_ONLY); resultScroll.first (); resultScroll.scroll (0); Liste fooPage = Lists.newArrayList (); int i = 0; mens (pageSize> i ++) {fooPage.add ((Foo) resultScroll.get (0)); hvis (! resultScroll.next ()) pause; }

Denne metoden er ikke bare tidseffektiv (bare en databasesamtale), men den lar brukeren få tilgang til totalt antall resultater satt uten ytterligere spørsmål:

resultScroll.last (); int totalResults = resultScroll.getRowNumber () + 1;

På den annen side må du huske at selv om rulling er ganske effektiv, kan et stort vindu ta opp en anstendig mengde hukommelse.

4. Paginering med dvalemodus ved bruk av Criteria API

Til slutt, la oss se på en mer fleksibel løsning - ved hjelp av kriterier:

Kriteriekriterier = session.createCriteria (Foo.class); criteria.setFirstResult (0); criteria.setMaxResults (pageSize); List firstPage = criteria.list ();

Hibernate Criteria query API gjør det veldig enkelt å også få det totale antallet - ved å bruke en Projeksjon gjenstand:

KriteriekriterierCount = session.createCriteria (Foo.class); criteriaCount.setProjection (Projections.rowCount ()); Langtall = (Langt) criteriaCount.uniqueResult ();

Som du kan se, vil bruk av denne APIen resultere i minimalt mer detaljert kode enn vanlig HQL, men API-en er helt typesikker og mye mer fleksibel.

5. Konklusjon

Denne artikkelen er en rask introduksjon til de forskjellige måtene å gjøre paginering på i dvale.

Implementeringen av denne våren JPA-opplæringen finner du i GitHub-prosjektet - dette er et Eclipse-basert prosjekt, så det skal være enkelt å importere og kjøre som det er.