jpa criteria builder 结合了分页和计数结果

标签 jpa count pagination eclipselink criteria

实现分页,您可以使用条件生成器从结果集中返回一个页面。但是,如果您需要获得全部结果(页数),则必须使用相同的计数条件运行单独的查询。

有没有办法将两者组合成单个数据库调用并节省性能而不返回完整集并自己实现页面?

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

最佳答案

CriteriaQuery<Long> cq = cb.createQuery(Long.class);
cq.select(cb.count(root)).where(pred).distinct(true);
Long maxPages = em.createQuery(cq).getSingleResult();    

我们使用这样的东西。我正在研究一种缓存结果的方法,这样我就不必在每次分页时都运行计数,但这现在对我们有用。

关于jpa criteria builder 结合了分页和计数结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34115782/

相关文章:

java - JPA 对所有者的多对多合并触发对连接表的删除

java - 为列的值创建一个序列,如果不存在值,则最小值为 1;如果存在值,则为比列上的最高值大 1

mysql - 从 mysql 表子查询中计算行号

php - 如何在php中执行多个计数查询

c# - MongoDB C# : Question about pagination

java - JPA + 如何使用第三个表作为一对多关系中的联接来选择记录?

java - JPA 映射接口(interface)

Cakephp 独特浏览次数

azure - 使用页面大小和页码在 Cosmos DB 中分页

iOS - 使用基于字典的 UITableView 进行分页