16

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

4

2 回答 2

14

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

interface CustomerRepository implements Repository<Customer, Long> {

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

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

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

于 2012-10-09T06:07:48.507 回答
4

对于分页,您需要 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 ;
}
于 2012-10-08T14:08:53.323 回答