【问题标题】:How to combine pagination with a criteria query in Spring Data JPA?如何在 Spring Data JPA 中将分页与条件查询结合起来?
【发布时间】:2012-09-28 17:18:45
【问题描述】:

我使用 PagingAndSortingRepository 和 findAll(Pageable pageable) 方法来分页我的数据。我认为没有办法提供任何条件。例如,有时我想选择和寻呼 city=NY 的地址。有没有办法同时提供条件和分页?

【问题讨论】:

    标签: java spring jpa spring-data spring-data-jpa


    【解决方案1】:

    PagingAndSortingRepository 只是在分页模式下添加了非常基本的 CRUD 方法。正如reference documentation 所描述的,您可以简单地将Pageable 参数添加到您定义的任何查询方法中,以实现此查询的分页。

    interface CustomerRepository implements Repository<Customer, Long> {
    
      Page<Customer> findByLastname(String lastname, Pageable pageable);
    
      List<Customer> findByFirstname(String firstname, Pageable pageable);
    }
    

    第一种方法将返回一个Page,其中包含页面元数据,例如可用元素总数等。为了计算此数据,它将触发一个额外的计数查询,以获取派生的查询。第二种查询方法返回纯切片结果集,不执行计数查询。

    【讨论】:

    • 您好 @Olivier 与 Pageagle 我看不到在哪里指定 offset, PageRequest 只接受 pagesize 。我真的不明白为什么我必须做page*size 才能得到我的offset。有什么方法可以使用offset 而不是page 吗?
    • PageRequest 暴露 pagesize 的原因只是 offset 是不够的,因为您仍然需要 size。分页的概念通常意味着以页面为中心的数据视图,这就是我们在这里表达的意思。但是没有什么能阻止您提出自己的 Pageable 实现,它适用于偏移量和大小。
    • 我们如何通过查询 API 使用分页?
    • 很好的解释!!
    【解决方案2】:

    对于分页,您需要 2 个方法,例如 getCount(Pageable pageable) 和 findAll(Pageable pageable)

    然而,在 Hibernate 中使用此功能是微不足道的。如果您有任何 HQL 查询,您可以简单地执行以下操作:

    public Long getCount(Pageable pageable) {
        Query q = session.createQuery("Select count(t) From TableClass  t where t.city = 'NY'");
        Long cnt = (Long) q.uniqueResult();
        return cnt;
    }
    
    public List<TableClass> findAll(Pageable pageable) {
         Query q = session.createQuery("From TableClass  t where t.city = 'NY'");
         q.setFirstResult(start);
         q.setMaxResults(length);
         List<TableClass> tableClasslist = q.list();
         return tableClasslist;
    }
    

    同样,如果你有一个 Criteria 查询,它实际上是同一件事:

    public Long getCount(Pageable pageable) {
        Criteria c = session.createCriteria(TableClass.class);
        c.setProjection(Projections.rowCount()); 
        Long cnt = (Long) c.uniqueResult();
        return cnt;
    }
    
    public List<TableClass> findAll(Pageable pageable) {
        Criteria c = session.createCriteria(TableClass.class);
        c.setParameter("city","NY");
        c.setFirstResult(start);
        c.setMaxResults(length);
        List<TableClass> tableClasslist = c.list();
        return tableClasslist ;
    }
    

    【讨论】:

    • 感谢您的帮助。我寻找 JPA 解决方案,但 DataNucleus 从问题标签中删除了 JPA。我使用 hibernate 标签来表示 Hibernate 是我的持久性提供者。
    猜你喜欢
    • 2020-04-11
    • 1970-01-01
    • 2015-02-08
    • 2022-01-06
    • 2020-06-08
    • 1970-01-01
    • 2020-06-06
    • 2013-06-10
    • 1970-01-01
    相关资源
    最近更新 更多