问题 如何在Spring Data JPA中将分页与条件查询相结合?


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


9044
2017-10-08 12:43


起源



答案:


PagingAndSortingRepository 只是在分页模式中添加了非常基本的CRUD方法。作为 参考文件 介绍,你可以简单地添加一个 Pageable 您定义的任何查询方法的参数,以实现此查询的分页。

interface CustomerRepository implements Repository<Customer, Long> {

  Page<Customer> findByLastname(String lastname, Pageable pageable);

  List<Customer> findByFirstname(String firstname, Pageable pageable);
}

第一种方法将返回一个 Page 包含页面元数据,如可用的总元素等。要计算此数据,它将触发派生查询的附加计数查询。第二个查询方法返回纯切片结果集,而不执行计数查询。


11
2017-10-09 06:07



你好@Olivier和Pageagle我看不到指定的地方 offset, PageRequest 只接受 page 和 size 。我真的不明白为什么我要做 page*size 得到我的 offset。有没有办法使用 offset 而不是 page ? - black sensei
原因 PageRequest 自曝 page 和 size 只有 offset 是不够的,因为你仍然需要 size。分页的概念通常意味着以数据为中心的页面视图,这就是我们在这里所表达的。但没有什么能阻止你想出自己的实现 Pageable 适用于偏移量和大小。 - Oliver Gierke
我们如何使用Pagivation与查询API?
好解释!! - Janath


答案:


PagingAndSortingRepository 只是在分页模式中添加了非常基本的CRUD方法。作为 参考文件 介绍,你可以简单地添加一个 Pageable 您定义的任何查询方法的参数,以实现此查询的分页。

interface CustomerRepository implements Repository<Customer, Long> {

  Page<Customer> findByLastname(String lastname, Pageable pageable);

  List<Customer> findByFirstname(String firstname, Pageable pageable);
}

第一种方法将返回一个 Page 包含页面元数据,如可用的总元素等。要计算此数据,它将触发派生查询的附加计数查询。第二个查询方法返回纯切片结果集,而不执行计数查询。


11
2017-10-09 06:07



你好@Olivier和Pageagle我看不到指定的地方 offset, PageRequest 只接受 page 和 size 。我真的不明白为什么我要做 page*size 得到我的 offset。有没有办法使用 offset 而不是 page ? - black sensei
原因 PageRequest 自曝 page 和 size 只有 offset 是不够的,因为你仍然需要 size。分页的概念通常意味着以数据为中心的页面视图,这就是我们在这里所表达的。但没有什么能阻止你想出自己的实现 Pageable 适用于偏移量和大小。 - Oliver Gierke
我们如何使用Pagivation与查询API?
好解释!! - Janath


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

然而,在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 ;
}

2
2017-10-08 14:08



谢谢你的帮助。我查找了JPA解决方案,但DataNucleus从问题标签中删除了JPA。我使用hibernate标签来表示Hibernate是我的持久性提供者。 - Mariusz