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.