实现分页,您可以使用条件生成器从结果集中返回一个页面。但是,如果您需要获得全部结果(页数),则必须使用相同的计数条件运行单独的查询。
有没有办法将两者组合成单个数据库调用并节省性能而不返回完整集并自己实现页面?
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<EntityJpa> cq = cb.createQuery(EntityJpa.class);
Root<EntityJpa> root = cq.from(EntityJpa.class);
Predicate p = cb.conjunction();
cq.where(p);
TypedQuery<EntityJpa> tq = em.createQuery(cq);
return tq.getResultList();
和计数
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
Root<EntityJpa> r = cq.from(EntityJpa.class);
Predicate p = cb.conjunction();
cq.where(p);
cq.select(cb.count(r));
TypedQuery<Long> tq = em.createQuery(cq);
return tq.getSingleResult().intValue();
最佳答案
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
cq.select(cb.count(root)).where(pred).distinct(true);
Long maxPages = em.createQuery(cq).getSingleResult();
我们使用这样的东西。我正在研究一种缓存结果的方法,这样我就不必在每次分页时都运行计数,但这现在对我们有用。
关于jpa criteria builder 结合了分页和计数结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34115782/