【发布时间】:2016-03-11 00:08:16
【问题描述】:
实现分页,您可以使用标准构建器从结果集中返回页面。但是,如果您需要获取全部结果(页数),则必须使用相同的计数条件运行单独的查询。
有没有办法将两者结合到一个数据库调用中并节省性能而不返回完整集并自己实现页面?
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();
【问题讨论】:
-
你问如何手动执行分页(例如,如果结果集很小)?如果您从数据库中获取所有结果,则计数仅为
tq.getResultList().size()。我很确定我在这里错过了重点...... -
谢谢@Robin。不,我们的数据集可以有数百万条记录。我在问是否有办法同时获取完整的查询计数和页面。
-
好的,现在我明白了,您想在进行分页时保存一个数据库往返。我认为使用 JPA 是不可能的,因为没有针对此的 SQL 标准,也没有所有主要数据库都提供对这种查询的支持。不过我可能错了,我也想了解一下解决方法!
-
我最近发现spring-boot-data-jpa支持这个。我需要深入研究代码以了解它是如何实现的
标签: jpa count pagination eclipselink criteria