Hibernate Pagination

1. Oversigt

Denne artikel er en hurtig introduktion til Pagination in Hibernate. Vi vil se på både standard HQL og Rulbare resultater API og endelig ved pagination med Hibernate Criteria.

2. Paginering med HQL og setFirstResult,setMaxResults API

Den enkleste og mest almindelige måde at gøre paginering på i dvale er ved hjælp af HQL:

Session session = sessionFactory.openSession (); Forespørgsel = sess.createQuery ("Fra Foo"); query.setFirstResult (0); query.setMaxResults (10); Liste fooList = fooList = query.list ();

Dette eksempel bruger en grundlæggende Foo enhed og ligner meget JPA med JQL-implementering - den eneste forskel er forespørgselssproget.

Hvis vi tænder logge på dvale, vi ser følgende SQL køres:

Dvaletilstand: vælg foo0_.id som id1_1_, foo0_.name som name2_1_ fra Foo foo0_ limit?

2.1. Det samlede antal og den sidste side

En pagineringsløsning er ikke komplet uden at vide det det samlede antal enheder:

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

Og endelig kan vi beregne ud fra det samlede antal og en given sidestørrelse den sidste side:

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

På dette tidspunkt kan vi se på et komplet eksempel på paginering, hvor vi beregner den sidste side og derefter henter den:

@Test offentlig ugyldighed givenEntitiesExist_whenRetrievingLastPage_thenCorrectSize () {int pageSize = 10; String countQ = "Vælg count (f.id) fra Foo f"; Query countQuery = session.createQuery (countQ); Lange countResults = (Lange) countQuery.uniqueResult (); int lastPageNumber = (int) (Math.ceil (countResults / pageSize)); Forespørgsel 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 hjælp af HQL og ScrollableResults API

Ved brug af ScrollableResults at implementere pagination har potentialet til reducere databaseopkald. Denne tilgang streamer resultatsættet, når programmet ruller igennem det, hvilket eliminerer behovet for at gentage forespørgslen for at udfylde hver side:

Streng hql = "FRA Foo f rækkefølge efter f.name"; Forespørgsel = 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 metode er ikke kun tidseffektiv (kun et databaseopkald), men det giver brugeren mulighed for at få adgang til samlet antal af det indstillede resultat uden en yderligere forespørgsel:

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

På den anden side skal du huske på, at selvom rulle er ret effektiv, kan et stort vindue optage en anstændig mængde hukommelse.

4. Paginering med dvale ved hjælp af Criteria API

Lad os endelig se på en mere fleksibel løsning - ved hjælp af kriterier:

Kriteriekriterier = session.createCriteria (Foo.class); criteria.setFirstResult (0); criteria.setMaxResults (pageSize); Liste firstPage = kriterier.liste ();

Hibernate Criteria-forespørgsel API gør det meget simpelt at også få det samlede antal - ved hjælp af en Fremskrivning objekt:

Kriterier criteriaCount = session.createCriteria (Foo.class); criteriaCount.setProjection (Projections.rowCount ()); Langt antal = (Lange) criteriaCount.uniqueResult ();

Som du kan se, vil brugen af ​​denne API resultere i minimalt mere detaljeret kode end almindelig HQL, men API'en er fuldt typesikker og meget mere fleksibel.

5. Konklusion

Denne artikel er en hurtig introduktion til de forskellige måder at gøre paginering på i dvale.

Implementeringen af ​​dette forår JPA Tutorial kan findes i GitHub-projektet - dette er et Eclipse-baseret projekt, så det skal være let at importere og køre som det er.