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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.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
jpa标准生成器结合分页和计数结果_Jpa_Count_Pagination_Eclipselink_Criteria - Fatal编程技术网

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();