در این بخش به بررسی Pagination با Hibernate و Hibernate Criteria میپردازیم
استفاده از HQL و متد های setMaxResults و setFirstResult :
Session session = sessionFactory.openSession(); Query query = sess.createQuery("From Foo"); query.setFirstResult(0); query.setMaxResults(10); List<Foo> fooList = fooList = query.list();
کوئری ساخته شده :
Hibernate: select foo0_.id as id1_1_, foo0_.name as name2_1_ from Foo foo0_ limit ?
دریافت تعدا کل Entity ها :
String countQ = "Select count (f.id) from Foo f"; Query countQuery = session.createQuery(countQ); Long countResults = (Long) countQuery.uniqueResult();
محاسبه تعداد کل صفحات :
int pageSize = 10; int lastPageNumber = (int) (Math.ceil(countResults / pageSize));
تست و پیاده سازی کامل :
@Test public void givenEntitiesExist_whenRetrievingLastPage_thenCorrectSize() { int pageSize = 10; String countQ = "Select count (f.id) from Foo f"; Query countQuery = session.createQuery(countQ); Long 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<Foo> lastPage = selectQuery.list(); assertThat(lastPage, hasSize(lessThan(pageSize + 1))); }
Pagination با HQL و ScrollableResults API :
استفاده از ScrollableResults کمک میکند که در مورد Pagination تعداد Database call ها کاهش یابد
String hql = "FROM Foo f order by f.name"; Query query = session.createQuery(hql); int pageSize = 10; ScrollableResults resultScroll = query.scroll(ScrollMode.FORWARD_ONLY); resultScroll.first(); resultScroll.scroll(0); List<Foo> fooPage = Lists.newArrayList(); int i = 0; while (pageSize > i++) { fooPage.add((Foo) resultScroll.get(0)); if (!resultScroll.next()) break; }
عیب این روش مصرف مقدار زیاد حافظه است
دریافت تعداد صفحات :
resultScroll.last(); int totalResults = resultScroll.getRowNumber() + 1;
Pagination با Hibernate Criteria موقعی که نیاز به راه حل منعطف تری داریم :
Criteria criteria = session.createCriteria(Foo.class); criteria.setFirstResult(0); criteria.setMaxResults(pageSize); List<Foo> firstPage = criteria.list();
دریافت تعداد صفحات :
Criteria criteriaCount = session.createCriteria(Foo.class); criteriaCount.setProjection(Projections.rowCount()); Long count = (Long) criteriaCount.uniqueResult();