我在我的存储库层中编写分页函数。函数作为参数接收spring的可分页对象和一些值,如下所示:
public Page<Foo> filterFoo(Pageable pageable, String value) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Foo> fooQuery = cb.createQuery(Foo.class);
Root<Foo> foo = fooQuery .from(Foo.class);
fooQuery .where(adding predicate for match value);
List<Foo> result = entityManager.createQuery(fooQuery )
.setFirstResult((pageable.getPageNumber() - 1) * pageable.getPageSize())
.setMaxResults(pageable.getPageSize())
.getResultList();
return new PageImpl<>(result, pageable, xxxx);
}
函数返回了用我的结果填充的spring的PageImpl对象。对于PageImpl,我还需要设置符合 predicate 的对象的总数。当然,这个计数必须不包括maxResult和firstResult。是否可以用我的fooQuery创建另一个数据库调用,以获得该查询的总数据库记录数而不受限制?在JPA中使用可分页和条件API的最佳实践是什么?谢谢你的建议。
1条答案
按热度按时间esyap4oy1#
由于生成的SQL使用别名-您可能需要进行单独的查询以获取总行数。例如:
其中,
filters
等于adding predicate for match value
表达式。此外,您可以使用带有自定义SQL函数的TupleQuery来计算一个
select
查询中的行数。如下所示:和条件:
了解有关
SQLFunction
的更多信息:https://vladmihalcea.com/hibernate-sql-function-jpql-criteria-api-query/和Custom SQL for Order in JPA Criteria API的函数