【问题标题】:jpa criteria builder combine pagination and count resultsjpa 标准生成器结合了分页和计数结果
【发布时间】:2016-03-11 00:08:16
【问题描述】:

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

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

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

【问题讨论】:

  • 你问如何手动执行分页(例如,如果结果集很小)?如果您从数据库中获取所有结果,则计数仅为tq.getResultList().size()。我很确定我在这里错过了重点......
  • 谢谢@Robin。不,我们的数据集可以有数百万条记录。我在问是否有办法同时获取完整的查询计数和页面。
  • 好的,现在我明白了,您想在进行分页时保存一个数据库往返。我认为使用 JPA 是不可能的,因为没有针对此的 SQL 标准,也没有所有主要数据库都提供对这种查询的支持。不过我可能错了,我也想了解一下解决方法!
  • 我最近发现spring-boot-data-jpa支持这个。我需要深入研究代码以了解它是如何实现的

标签: jpa count pagination eclipselink criteria


【解决方案1】:
CriteriaQuery<Long> cq = cb.createQuery(Long.class);
cq.select(cb.count(root)).where(pred).distinct(true);
Long maxPages = em.createQuery(cq).getSingleResult();    

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

【讨论】:

    猜你喜欢
    • 2012-10-28
    • 2018-12-12
    • 2021-11-02
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2021-06-03
    • 1970-01-01
    相关资源
    最近更新 更多