Hibernácia stránkovania

1. Prehľad

Tento článok je rýchly úvod do stránkovania v režime dlhodobého spánku. Pozrime sa na štandardné HQL aj na Posúvateľné výsledky API a nakoniec pri stránkovaní pomocou kritérií dlhodobého spánku.

2. Stránkovanie s HQL a setFirstResult,setMaxResults API

Najjednoduchší a najbežnejší spôsob stránkovania v režime dlhodobého spánku je pomocou HQL:

Relácia session = sessionFactory.openSession (); Query query = sess.createQuery ("From Foo"); query.setFirstResult (0); query.setMaxResults (10); Zoznam fooList = fooList = query.list ();

Tento príklad používa základné Foo entita a je veľmi podobný JPA s implementáciou JQL - jediný rozdiel je v dotazovacom jazyku.

Ak sa zapneme prihlasovanie do režimu dlhodobého spánku, uvidíme spustený nasledujúci SQL:

Hibernácia: vybrať foo0_.id ako id1_1_, foo0_.name ako name2_1_ z limitu Foo foo0_?

2.1. Celkový počet a posledná stránka

Riešenie stránkovania nie je úplné bez vedomia celkový počet subjektov:

String countQ = "Vyberte počet (f.id) z Foo f"; Query countQuery = session.createQuery (countQ); Long countResults = (Long) countQuery.uniqueResult ();

A na záver môžeme vypočítať z celkového počtu a danej veľkosti stránky posledná strana:

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

V tomto okamihu sa môžeme pozrieť na úplný príklad stránkovania, kde vypočítavame poslednú stránku a potom ju načítame:

@Test public void givenEntitiesExist_whenRetrievingLastPage_thenCorrectSize () {int pageSize = 10; String countQ = "Vyberte počet (f.id) z Foo f"; Query countQuery = session.createQuery (countQ); Long countResults = (Long) countQuery.uniqueResult (); int lastPageNumber = (int) (Math.ceil (countResults / pageSize)); Dotaz selectQuery = session.createQuery ("Od Foo"); selectQuery.setFirstResult ((lastPageNumber - 1) * pageSize); selectQuery.setMaxResults (pageSize); Zoznam lastPage = selectQuery.list (); assertThat (lastPage, hasSize (lessThan (pageSize + 1))); }

3. Stránkovanie s režimom dlhodobého spánku pomocou HQL a rozhrania ScrollableResults API

Použitím ScrollableResults na implementáciu stránkovania má potenciál znížiť hovory v databáze. Tento prístup streamuje množinu výsledkov, keď ju program posúva, a preto eliminuje potrebu opakovania dotazu na vyplnenie každej stránky:

Reťazec hql = "ZO Foo f objednávky podľa f.name"; Dotaz na dopyt = session.createQuery (hql); int pageSize = 10; ScrollableResults resultScroll = query.scroll (ScrollMode.FORWARD_ONLY); resultScroll.first (); resultScroll.scroll (0); Zoznam fooPage = Lists.newArrayList (); int i = 0; while (pageSize> i ++) {fooPage.add ((Foo) resultScroll.get (0)); if (! resultScroll.next ()) break; }

Táto metóda je nielen časovo efektívna (iba jedno volanie do databázy), ale umožňuje používateľovi získať prístup k celkový počet množiny výsledkov bez ďalšieho dotazu:

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

Na druhú stranu majte na pamäti, že aj keď je posúvanie celkom efektívne, veľké okno môže trvať slušne veľa Pamäť.

4. Stránkovanie s režimom dlhodobého spánku pomocou rozhrania API kritérií

Nakoniec sa pozrime na flexibilnejšie riešenie - pomocou kritérií:

Kritériá kritérií = session.createCriteria (Foo.class); kritériá.setFirstResult (0); riteria.setMaxResults (pageSize); Zoznam firstPage = criteria.list ();

Vďaka rozhraniu API dotazu Hibernate Criteria je taktiež veľmi jednoduché získajte celkový počet - použitím a Projekcia objekt:

Criteria criteriaCount = session.createCriteria (Foo.class); riticesCount.setProjection (Projections.rowCount ()); Dlhý počet = (Dlhý) kritériáCount.uniqueResult ();

Ako vidíte, použitie tohto API bude mať za následok minimálne podrobnejší kód ako obyčajný HQL, ale API je úplne bezpečné a oveľa flexibilnejšie.

5. Záver

Tento článok predstavuje rýchly úvod do rôznych spôsobov stránkovania v režime dlhodobého spánku.

Implementáciu tohto jarného JPA tutoriálu nájdete v projekte GitHub - jedná sa o projekt založený na Eclipse, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


$config[zx-auto] not found$config[zx-overlay] not found