Spring 数据 JDBC - 自定义查询可分页
Spring Data JDBC - Pageable on custom Query
在我的项目中,我有一个扩展 CrudRepository 的存储库。里面有一个自定义查询:
public interface CustomerRepository extends CrudRepository<Customer, Long> {
@Query("select * from person where firstname = :firstname")
List<Customer> findByFirstname(@Param("firstname") String firstname, Pageable pageable);
}
在我的服务中-Class我尝试将列表放在可分页的对象中,例如:
... getPageableCustomer(String firstname, Pageable pageable){
// => By using "Sol" I got 90 matching entries
List<Customer> custList = customerRepository.findByFirstname(firstname, pageable);
Page<Customer> custPage = new PageImpl<Customer>(custList, pageable, custList.size());
return custPage;
}
return 值包括完整列表“custList”。获取具有指定偏移量和大小的可分页对象的最佳方法是什么?
一种选择是使用
customer.subList(fromIndex, toIndex)
但这感觉不对。也因为将所有数据加载到列表中,而不是仅按可分页参数化的大小和偏移量获取数据。
备注:如果在存储库中使用页面,我会得到 org.springframework.dao.IncorrectResultSizeDataAccessException:结果大小不正确:预期为 1,实际为 88
这里还有一个开放的 Jira 改进:
https://jira.spring.io/browse/DATAJDBC-554?filter=-3
希望得到一些帮助...
我收到了 Dirk Luijk 对 JIRA-Issue 的回复(Thx Dirk :))
https://jira.spring.io/browse/DATAJDBC-554?filter=-3
interface FooRepository extends PagingAndSortingRepository<FooEntity, Long> {
List<FooEntity> findAllByBar(String bar, Pageable pageable);
Long countAllByBar(String bar);
}
然后像这样组合这 2 个查询:
List<FooEntity> fooList = repository.findAllByBar("...", pageable);
Long fooTotalCount = repository.countAllByBar("...");
Page<FooEntity> fooPage = PageableExecutionUtils.getPage(fooList, pageable, () -> fooTotalCount);
“您的解决方法中的错误是您的自定义查询。在 Spring Data JDBC 2.0 中,您不需要使用它,特殊查询除外,但它们不支持可分页。 “
可以找到可能的参数:
https://docs.spring.io/spring-data/jdbc/docs/current/reference/html/#jdbc.query-methods
谢谢德克,
我还找到了一个变通方法来获取它 运行 自定义查询。只需使用 limit、offset 和 orderBy 作为附加参数,如下所示:
@Query("select * from person where firstname = :name order by :order limit :size offset :offset")
List<Customer> findByFirstNameCustomQuery(@Param("name") String name, Pageable page, @Param("offset") long offset,
@Param("size") long size, @Param("order") String order);
然后将服务内的调用更改为:
List<Customer> custList = customerRepository.findByFirstNameCustomQuery(firstname, pageable, ....
在我的项目中,我有一个扩展 CrudRepository 的存储库。里面有一个自定义查询:
public interface CustomerRepository extends CrudRepository<Customer, Long> {
@Query("select * from person where firstname = :firstname")
List<Customer> findByFirstname(@Param("firstname") String firstname, Pageable pageable);
}
在我的服务中-Class我尝试将列表放在可分页的对象中,例如:
... getPageableCustomer(String firstname, Pageable pageable){
// => By using "Sol" I got 90 matching entries
List<Customer> custList = customerRepository.findByFirstname(firstname, pageable);
Page<Customer> custPage = new PageImpl<Customer>(custList, pageable, custList.size());
return custPage;
}
return 值包括完整列表“custList”。获取具有指定偏移量和大小的可分页对象的最佳方法是什么?
一种选择是使用
customer.subList(fromIndex, toIndex)
但这感觉不对。也因为将所有数据加载到列表中,而不是仅按可分页参数化的大小和偏移量获取数据。
备注:如果在存储库中使用页面,我会得到 org.springframework.dao.IncorrectResultSizeDataAccessException:结果大小不正确:预期为 1,实际为 88
这里还有一个开放的 Jira 改进: https://jira.spring.io/browse/DATAJDBC-554?filter=-3
希望得到一些帮助...
我收到了 Dirk Luijk 对 JIRA-Issue 的回复(Thx Dirk :))
https://jira.spring.io/browse/DATAJDBC-554?filter=-3
interface FooRepository extends PagingAndSortingRepository<FooEntity, Long> {
List<FooEntity> findAllByBar(String bar, Pageable pageable);
Long countAllByBar(String bar);
}
然后像这样组合这 2 个查询:
List<FooEntity> fooList = repository.findAllByBar("...", pageable);
Long fooTotalCount = repository.countAllByBar("...");
Page<FooEntity> fooPage = PageableExecutionUtils.getPage(fooList, pageable, () -> fooTotalCount);
“您的解决方法中的错误是您的自定义查询。在 Spring Data JDBC 2.0 中,您不需要使用它,特殊查询除外,但它们不支持可分页。 “
可以找到可能的参数:
https://docs.spring.io/spring-data/jdbc/docs/current/reference/html/#jdbc.query-methods
谢谢德克,
我还找到了一个变通方法来获取它 运行 自定义查询。只需使用 limit、offset 和 orderBy 作为附加参数,如下所示:
@Query("select * from person where firstname = :name order by :order limit :size offset :offset")
List<Customer> findByFirstNameCustomQuery(@Param("name") String name, Pageable page, @Param("offset") long offset,
@Param("size") long size, @Param("order") String order);
然后将服务内的调用更改为:
List<Customer> custList = customerRepository.findByFirstNameCustomQuery(firstname, pageable, ....