Slaapstand paginering

1. Overzicht

Dit artikel is een korte inleiding tot paginering in slaapstand. We kijken zowel naar de standaard HQL als naar de ScrollableResults API en tot slot bij paginering met Hibernate Criteria.

2. Paginering met HQL en setFirstResult,setMaxResults API

De eenvoudigste en meest gebruikelijke manier om paginering in Hibernate uit te voeren is met behulp van HQL:

Sessiesessie = sessionFactory.openSession (); Queryquery = sess.createQuery ("From Foo"); query.setFirstResult (0); query.setMaxResults (10); Lijst fooList = fooList = query.list ();

Dit voorbeeld gebruikt een basic Foo entiteit en lijkt sterk op de JPA met JQL-implementatie - het enige verschil is de querytaal.

Als we inschakelen logboekregistratie voor slaapstand, we zullen zien dat de volgende SQL wordt uitgevoerd:

Slaapstand: selecteer foo0_.id als id1_1_, foo0_.name als naam2_1_ van Foo foo0_ limit?

2.1. Het totale aantal en de laatste pagina

Een pagineringsoplossing is niet compleet zonder het te weten het totale aantal entiteiten:

String countQ = "Selecteer count (f.id) van Foo f"; Query countQuery = session.createQuery (countQ); Long countResults = (Long) countQuery.uniqueResult ();

En tot slot kunnen we uit het totale aantal en een bepaald paginaformaat berekenen de laatste pagina:

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

Op dit punt kunnen we kijken een compleet voorbeeld voor paginering, waar we de laatste pagina berekenen en deze vervolgens ophalen:

@Test openbare leegte gegevenEntitiesExist_whenRetrievingLastPage_thenCorrectSize () {int pageSize = 10; String countQ = "Selecteer count (f.id) van Foo f"; Query countQuery = session.createQuery (countQ); Long countResults = (Long) countQuery.uniqueResult (); int lastPageNumber = (int) (Math.ceil (countResults / pageSize)); Query selectQuery = session.createQuery ("Van Foo"); selectQuery.setFirstResult ((lastPageNumber - 1) * pageSize); selectQuery.setMaxResults (pageSize); Lijst lastPage = selectQuery.list (); assertThat (lastPage, hasSize (lessThan (pageSize + 1))); }

3. Paginering met slaapstand met behulp van HQL en de ScrollableResults API

Gebruik makend van ScrollableResults om paginering te implementeren heeft de potentie om vermindering van databaseaanroepen. Deze aanpak streamt de resultatenset terwijl het programma er doorheen scrolt, waardoor het niet nodig is om de vraag te herhalen om elke pagina te vullen:

String hql = "FROM Foo f order by f.name"; Queryquery = session.createQuery (hql); int pageSize = 10; ScrollableResults resultScroll = query.scroll (ScrollMode.FORWARD_ONLY); resultScroll.first (); resultScroll.scroll (0); Lijst fooPage = Lists.newArrayList (); int i = 0; while (pageSize> i ++) {fooPage.add ((Foo) resultScroll.get (0)); if (! resultScroll.next ()) breken; }

Deze methode is niet alleen tijdbesparend (slechts één databaseaanroep), maar geeft de gebruiker ook toegang tot het totale telling van de resultatenset zonder een aanvullende vraag:

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

Houd er echter rekening mee dat, hoewel scrollen behoorlijk efficiënt is, een groot venster een behoorlijke hoeveelheid geheugen.

4. Paginering met slaapstand met behulp van de Criteria API

Laten we tot slot eens kijken een meer flexibele oplossing - criteria gebruiken:

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

Hibernate Criteria query API maakt het heel eenvoudig om ook krijg het totale aantal - door een Projectie voorwerp:

Criteria criteriaCount = session.createCriteria (Foo.class); criteriaCount.setProjection (Projections.rowCount ()); Lange telling = (Lange) criteriaCount.uniqueResult ();

Zoals u kunt zien, zal het gebruik van deze API resulteren in minimaal meer uitgebreide code dan gewone HQL, maar de API is volledig typeveilig en veel flexibeler.

5. Conclusie

Dit artikel is een korte inleiding tot de verschillende manieren om paginering in Hibernate uit te voeren.

De implementatie van deze Spring JPA-zelfstudie is te vinden in het GitHub-project - dit is een op Eclipse gebaseerd project, dus het moet gemakkelijk te importeren en uit te voeren zijn zoals het is.