Hibernacija paginacija

1. Pregled

Ovaj je članak brz uvod u Paginaciju u hibernaciji. Razmotrit ćemo standardni HQL kao i ScrollableResults API, i konačno, na paginaciji s Hibernate Criteria.

2. Paginacija s HQL i setFirstResult,setMaxResults API

Najjednostavniji i najčešći način izvršavanja paginacije u hibernaciji je pomoću HQL-a:

Sjednica sesije = sessionFactory.openSession (); Upit upita = sess.createQuery ("From Foo"); query.setFirstResult (0); query.setMaxResults (10); Popis fooList = fooList = query.list ();

Ovaj se primjer koristi osnovnim Foo entitet i vrlo je sličan JPA s implementacijom JQL - jedina razlika je jezik upita.

Ako se uključimo sječa za hibernaciju, vidjet ćemo kako se izvodi sljedeći SQL:

Hibernate: odaberite foo0_.id kao id1_1_, foo0_.name kao name2_1_ iz ograničenja Foo foo0_?

2.1. Ukupno brojanje i zadnja stranica

Paginacijsko rješenje nije potpuno bez znanja ukupan broj entiteta:

String countQ = "Odaberite broj (f.id) iz Foo f"; Upit countQuery = session.createQuery (countQ); Long countResults = (Long) countQuery.uniqueResult ();

I na kraju, iz ukupnog broja i zadane veličine stranice možemo izračunati zadnja stranica:

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

U ovom trenutku možemo pogledati cjelovit primjer za paginaciju, gdje izračunavamo zadnju stranicu i zatim je dohvaćamo:

@Test javna praznina givenEntitiesExist_whenRetrievingLastPage_thenCorrectSize () {int pageSize = 10; String countQ = "Odaberite broj (f.id) iz Foo f"; Upit countQuery = session.createQuery (countQ); Long countResults = (Long) countQuery.uniqueResult (); int lastPageNumber = (int) (Math.ceil (countResults / pageSize)); Upit selectQuery = session.createQuery ("From Foo"); selectQuery.setFirstResult ((lastPageNumber - 1) * pageSize); selectQuery.setMaxResults (pageSize); Popis lastPage = selectQuery.list (); assertThat (lastPage, hasSize (lessThan (pageSize + 1))); }

3. Paginacija s hibernacijom pomoću HQL-a i API-ja ScrollableResults

Koristeći ScrollableResults za provedbu paginacije ima potencijal smanjiti pozive baze podataka. Ovaj pristup struji skup rezultata dok se program kroz njega kreće, čime se eliminira potreba za ponavljanjem upita za popunjavanje svake stranice:

Niz hql = "OD Foo za poredak po f.name"; Upit upita = session.createQuery (hql); int pageSize = 10; ScrollableResults resultScroll = query.scroll (ScrollMode.FORWARD_ONLY); resultScroll.first (); resultScroll.scroll (0); Popis fooPage = Lists.newArrayList (); int i = 0; while (pageSize> i ++) {fooPage.add ((Foo) resultScroll.get (0)); if (! resultScroll.next ()) break; }

Ova metoda nije samo vremenski učinkovita (samo jedan poziv baze podataka), već korisniku omogućuje pristup ukupan broj skupa rezultata bez dodatnog upita:

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

S druge strane, imajte na umu da, iako je pomicanje prilično učinkovito, veliki prozor može zauzeti pristojnu količinu memorija.

4. Paginiranje s hibernacijom koristeći API kriterija

Napokon, pogledajmo fleksibilnije rješenje - koristeći kriterije:

Kriteriji kriterija = session.createCriteria (Foo.class); kriteriji.setFirstResult (0); criteria.setMaxResults (pageSize); Popis firstPage = kriterij.list ();

API upita za hibernacijske kriterije također ga čini vrlo jednostavnim dobiti ukupni broj - pomoću a Projekcija objekt:

Kriteriji kriterijCount = session.createCriteria (Foo.class); criteriaCount.setProjection (Projections.rowCount ()); Dugo brojanje = (Dugo) criteriaCount.uniqueResult ();

Kao što vidite, upotreba ovog API-ja rezultirat će minimalno više detaljnog koda od običnog HQL-a, ali API je potpuno siguran i puno fleksibilniji.

5. Zaključak

Ovaj je članak kratki uvod u različite načine paginiranja u hibernaciji.

Provedbu ovog proljetnog JPA vodiča možete pronaći u projektu GitHub - ovo je projekt zasnovan na Eclipseu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.