Java 如何在SpringDataJPA中将分页与条件查询结合起来?
我使用PagingAndSortingRepository和findAll(Pageable Pageable)方法来分页数据。我认为没有办法提供任何条件。例如,有时我需要选择和分页地址,其中city=NY。有什么方法可以同时提供条件和分页吗?对于分页,您需要两种方法,如getCount(Pageable Pageable)和findAll(Pageable Pageable) 然而,在Hibernate中利用这个功能是微不足道的。如果您有任何HQL查询,只需执行以下操作:Java 如何在SpringDataJPA中将分页与条件查询结合起来?,java,spring,jpa,spring-data,spring-data-jpa,Java,Spring,Jpa,Spring Data,Spring Data Jpa,我使用PagingAndSortingRepository和findAll(Pageable Pageable)方法来分页数据。我认为没有办法提供任何条件。例如,有时我需要选择和分页地址,其中city=NY。有什么方法可以同时提供条件和分页吗?对于分页,您需要两种方法,如getCount(Pageable Pageable)和findAll(Pageable Pageable) 然而,在Hibernate中利用这个功能是微不足道的。如果您有任何HQL查询,只需执行以下操作: public Lon
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;
}
public Long getCount(可分页){
Query q=session.createQuery(“从TableClass t中选择计数(t),其中t.city='NY'”);
Long cnt=(Long)q.uniqueResult();
返回cnt;
}
公共列表findAll(可分页){
Query q=session.createQuery(“来自TableClass t,其中t.city='NY'”);
q、 setFirstResult(开始);
q、 setMaxResults(长度);
List tableClasslist=q.List();
返回表类列表;
}
同样,如果您有一个条件查询,它实际上是相同的:
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 ;
}
public Long getCount(可分页){
条件c=session.createCriteria(TableClass.class);
c、 setProjection(Projections.rowCount());
长cnt=(长)c.uniqueResult();
返回cnt;
}
公共列表findAll(可分页){
条件c=session.createCriteria(TableClass.class);
c、 设置参数(“城市”、“纽约”);
c、 setFirstResult(开始);
c、 setMaxResults(长度);
List tableClasslist=c.List();
返回表类列表;
}
分页和排序存储库只是在分页模式中添加了非常基本的CRUD方法。如所述,您可以简单地将Pageable
参数添加到您定义的任何查询方法中,以实现此查询的分页
interface CustomerRepository implements Repository<Customer, Long> {
Page<Customer> findByLastname(String lastname, Pageable pageable);
List<Customer> findByFirstname(String firstname, Pageable pageable);
}
接口CustomerRepository实现存储库{
PageFindBylastName(字符串lastname,可分页);
列出findByFirstname(字符串firstname,可分页);
}
第一种方法将返回一个
页面
,其中包含页面元数据,如可用元素总数等。为了计算此数据,它将触发对派生查询的额外计数查询。第二个查询方法返回普通切片结果集,而不执行计数查询。谢谢您的帮助。我寻找JPA解决方案,但DataNucleus从问题的标签中删除了JPA。我使用hibernate标记表示hibernate是我的持久性提供者。Hello@Olivier和Pageagle我不知道在哪里指定偏移量
,页面请求
只接受页面
和大小
。我真的不明白为什么我必须做page*size
才能得到我的偏移量。有没有办法使用offset
而不是page
?原因PageRequest
暴露page
和size
,因为只有offset
是不够的,因为您仍然需要size
。分页的概念通常意味着以页面为中心的数据视图,这就是我们在这里所表达的。但是,没有什么可以阻止您提出自己的Pageable
实现,它可以处理偏移量和大小。我们如何将分页与查询API结合使用?很好的解释!!