Hibernált oldalszámozás

1. Áttekintés

Ez a cikk gyors bevezetés a hibernált lapozáshoz. Megnézzük a szokásos HQL-t és a ScrollableResults API, és végül a Hibernate Criteria oldalszámozásakor.

2. Lapozás HQL-vel és setFirstResult,setMaxResults API

A lapozás egyszerűbb és leggyakoribb módja hibernált állapotban a HQL használatával:

Munkamenet = sessionFactory.openSession (); Lekérdezés = sess.createQuery ("From Foo"); query.setFirstResult (0); query.setMaxResults (10); List fooList = fooList = query.list ();

Ez a példa egy alapszintűet használ Foo entitás, és nagyon hasonlít a JQL megvalósításával rendelkező JPA-ra - az egyetlen különbség a lekérdezés nyelve.

Ha bekapcsolunk naplózás Hibernate számára, látni fogjuk, hogy a következő SQL fut:

Hibernálás: válassza a foo0_.id értéket id1_1_, a foo0_.name pedig név2_1_ lehetőséget a Foo foo0_ korlátból?

2.1. A teljes szám és az utolsó oldal

A lapozás megoldása nem teljes anélkül, hogy tudnánk az entitások teljes száma:

String countQ = "Válassza ki a számot (f.id) a Foo f-ből"; Query countQuery = session.createQuery (countQ); Hosszú countResults = (Long) countQuery.uniqueResult ();

Végül pedig a teljes szám és az adott oldalméret alapján kiszámíthatjuk az utolsó oldal:

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

Ezen a ponton megnézhetjük teljes példa a lapozásra, ahol kiszámoljuk az utolsó oldalt, majd lekérjük:

@Test public void givenEntitiesExist_whenRetrievingLastPage_thenCorrectSize () {int pageSize = 10; String countQ = "Válassza ki a számot (f.id) a Foo f-ből"; Query countQuery = session.createQuery (countQ); Hosszú countResults = (Long) countQuery.uniqueResult (); int lastPageNumber = (int) (Math.ceil (countResults / pageSize)); Query selectQuery = session.createQuery ("From Foo"); selectQuery.setFirstResult ((lastPageNumber - 1) * pageSize); selectQuery.setMaxResults (pageSize); List lastPage = selectQuery.list (); assertThat (lastPage, hasSize (lessThan (pageSize + 1))); }

3. Paginálás hibernált állapotban a HQL és a ScrollableResults API segítségével

Használata ScrollableResulA lapszámozás megvalósításához szükségesek a lehetőségek csökkenteni az adatbázis-hívásokat. Ez a megközelítés közvetíti az eredményhalmazt, amint a program végiggörgeti, így nincs szükség a lekérdezés megismételésére az egyes oldalak kitöltéséhez:

Karakterlánc hql = "FROM Foo f sorrend f.name szerint"; Lekérdezés = session.createQuery (hql); int pageSize = 10; ScrollableResults resultScroll = query.scroll (ScrollMode.FORWARD_ONLY); resultScroll.first (); resultScroll.scroll (0); FooPage = Lists.newArrayList () lista; int i = 0; while (pageSize> i ++) {fooPage.add ((Foo) resultScroll.get (0)); if (! resultScroll.next ()) törés; }

Ez a módszer nemcsak időhatékony (csak egy adatbázis-hívás), de lehetővé teszi a felhasználó számára, hogy hozzáférjen az az eredménykészlet összesített száma további lekérdezés nélkül:

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

Másrészt ne feledje, hogy bár a görgetés meglehetősen hatékony, egy nagy ablak tisztességes mennyiséget vehet fel memória.

4. Hibernált oldalszámozás a Criteria API használatával

Végül nézzük meg rugalmasabb megoldás - kritériumok használata:

Feltételek kritériumai = session.createCriteria (Foo.class); feltételek.setFirstResult (0); feltételek.setMaxResults (pageSize); List firstPage = feltételek.list ();

A Hibernate Criteria query API nagyon egyszerűvé teszi azt is kapja meg a teljes számot - az a használatával Kivetítés tárgy:

Feltételek kritériumaiCount = session.createCriteria (Foo.class); feltételekCount.setProjection (Projections.rowCount ()); Hosszú szám = (Hosszú) feltételekCount.uniqueResult ();

Amint láthatja, ennek az API-nak a használata minimálisan több bőbeszédű kódot eredményez, mint a sima HQL, de az API teljesen biztonságos és sokkal rugalmasabb.

5. Következtetés

Ez a cikk gyors bemutatást nyújt a hibernálásban történő paginálás különféle módjairól.

Ennek a tavaszi JPA-oktatóanyagnak a megvalósítása megtalálható a GitHub projektben - ez egy Eclipse-alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.