jpa标准生成器结合分页和计数结果
实现分页可以使用条件生成器从结果集中返回页面。但是,如果需要获得完整的结果(页面),则必须使用相同的计数条件运行单独的查询 有没有一种方法可以将这两者结合到一个数据库调用中,并在不返回完整集的情况下节省性能,并且自己实现页面jpa标准生成器结合分页和计数结果,jpa,count,pagination,eclipselink,criteria,Jpa,Count,Pagination,Eclipselink,Criteria,实现分页可以使用条件生成器从结果集中返回页面。但是,如果需要获得完整的结果(页面),则必须使用相同的计数条件运行单独的查询 有没有一种方法可以将这两者结合到一个数据库调用中,并在不返回完整集的情况下节省性能,并且自己实现页面 CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<EntityJpa> cq = cb.createQuery(EntityJpa.class); Root<En
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 cq=cb.createQuery(EntityJpa.class);
Root=cq.from(EntityJpa.class);
谓词p=cb.conjunction();
cq.其中(p);
TypedQuery tq=em.createQuery(cq);
返回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();
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(Long.class);
根r=cq.from(EntityJpa.class);
谓词p=cb.conjunction();
cq.其中(p);
cq.选择(cb.计数(r));
TypedQuery tq=em.createQuery(cq);
返回tq.getSingleResult().intValue();
CriteriaQuery cq=cb.createQuery(Long.class);
cq.select(cb.count(root)).where(pred).distinct(true);
Long maxPages=em.createQuery(cq).getSingleResult();
我们利用这样的东西。我正在研究一种缓存结果的方法,这样我就不必在每次分页时都运行计数,但现在这对我们来说是可行的 您是否询问如何手动执行分页(例如,如果结果集很小)?如果从数据库中获取所有结果,则计数将仅为
tq.getResultList().size()
。我很确定我没有抓住要点……谢谢@Robin。不,我们的数据集可以有数百万条记录。我在问是否有一种方法可以同时获得完整的查询计数和页面。现在我明白了,您希望在分页时保存一个db往返。我认为使用JPA不可能做到这一点,因为没有SQL标准,所有主要数据库也不支持这种查询。但我可能错了,我也想了解一个解决方案!我最近发现spring引导数据jpa支持这一点。我需要深入研究代码,找出这是如何实现的
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
cq.select(cb.count(root)).where(pred).distinct(true);
Long maxPages = em.createQuery(cq).getSingleResult();