Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA条件返回一个页面和总计_Java_Jpa_Criteria - Fatal编程技术网

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的额外调用。这将使访问第一页期间获得的性能增益可以忽略不计

我的意思是:要访问第一页,您需要:

  • 未分页的已筛选项的总数
  • 第1页分页的筛选项目
  • 对于访问其他页面,您不再需要count查询。您只需要为第x页筛选项目

    展开n个页面后,即使使用您正在寻找的优化,您也会执行n次调用,而不是非优化版本的n+1次调用。所以,我不会花太多时间考虑这个问题


    在您的实现中,您只需小心,不要在不必要的情况下执行记录计数:只有在用户更改筛选后才需要它。

    thank You@perissf非常好。客户端是无状态的,因此每个调用可能是第一个调用,因此我需要提供所有响应的总计数。数据库在不断地变化,我的总变化量从一个调用到另一个调用,从一个页面到另一个页面(增长)。在我的例子中,进行组合查询将很有用。它将DB调用从2n减少到n。我的理解是,要对数据库进行分页,必须获取所有对象,因此计数应该几乎是免费的。