Java JPA条件返回一个页面和总计
对于分页数据(分页),我需要返回与我的条件和第一页结果匹配的记录总数。这对于为用户显示信息和计算(在客户端上)预期的总页数非常有用 目前,我运行了两次相同的查询,一次用于总计数,一次用于实际记录。我希望有一个更有效的方法 这两个查询是否可以合并为对数据库的一个调用 伯爵:Java JPA条件返回一个页面和总计,java,jpa,criteria,Java,Jpa,Criteria,对于分页数据(分页),我需要返回与我的条件和第一页结果匹配的记录总数。这对于为用户显示信息和计算(在客户端上)预期的总页数非常有用 目前,我运行了两次相同的查询,一次用于总计数,一次用于实际记录。我希望有一个更有效的方法 这两个查询是否可以合并为对数据库的一个调用 伯爵: CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Long> cq = cb.createQuery(Long.class);
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
Root<VersionJpa> r = cq.from(VersionJpa.class);
Predicate p = cb.conjunction();
p = // some filtering code define by caller
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(VersionJpa.class);
谓词p=cb.conjunction();
p=//一些由调用方定义的筛选代码
cq.其中(p);
cq.选择(cb.计数(r));
TypedQuery tq=em.createQuery(cq);
返回tq.getSingleResult().intValue();
页面:
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<VersionJpa> cq = cb.createQuery(VersionJpa.class);
Root<VersionJpa> root = cq.from(VersionJpa.class);
Predicate p = cb.conjunction();
p = // same filtering code as in the count above
cq.where(p);
TypedQuery<VersionJpa> tq = em.createQuery(cq);
// paginatong
tq.setFirstResults(first); // from caller
tq.setMaxResults(max); // from caller
return tq.getResultList();
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery cq=cb.createQuery(VersionJpa.class);
Root=cq.from(VersionJpa.class);
谓词p=cb.conjunction();
p=//与上述计数中的过滤代码相同
cq.其中(p);
TypedQuery tq=em.createQuery(cq);
//帕吉纳通
tq.setFirstResults(第一);//来自来电者
tq.setMaxResults(最大值);//来自来电者
返回tq.getResultList();
即使存在检索记录计数和分页记录本身的有效查询,您也需要为用户访问的每个页面执行对db的额外调用。这将使访问第一页期间获得的性能增益可以忽略不计
我的意思是:要访问第一页,您需要:
在您的实现中,您只需小心,不要在不必要的情况下执行记录计数:只有在用户更改筛选后才需要它。thank You@perissf非常好。客户端是无状态的,因此每个调用可能是第一个调用,因此我需要提供所有响应的总计数。数据库在不断地变化,我的总变化量从一个调用到另一个调用,从一个页面到另一个页面(增长)。在我的例子中,进行组合查询将很有用。它将DB调用从2n减少到n。我的理解是,要对数据库进行分页,必须获取所有对象,因此计数应该几乎是免费的。