提问者:小点点

Spring Data JDBC-可在自定义查询上分页


在我的项目中,我有一个扩展CrudRepository的存储库。在那里我有一个自定义查询:

    public interface CustomerRepository extends CrudRepository<Customer, Long> {
       @Query("select * from person where firstname = :firstname")
       List<Customer> findByFirstname(@Param("firstname") String firstname, Pageable pageable);
    }

在我的服务类中,我尝试将列表放在可分页的对象中,例如:

... 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;
}

返回值包括完整的List“CustList”。获取具有指定偏移量和大小的可分页对象的最佳方法是什么?

一种选择是使用

customer.subList(fromIndex, toIndex)

但这感觉不对。也因为加载列表中的所有数据,而不仅仅是按大小和偏移量获取数据,因为参数化为可分页。

备注:如果在存储库中使用Page,我将获取org. springframe.da.In更正结果SizeDataAccessException:结果大小不正确:预期1,实际88

Jira还有一个开放的改进,可以在这里找到:https://jira.spring.io/browse/DATAJDBC-554?filter=-3

希望得到一些帮助…


共1个答案

匿名用户

我收到了Dirk Luijk关于JIRA问题的回复(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);
}

然后像这样组合这两个查询:

List<FooEntity> fooList = repository.findAllByBar("...", pageable);
Long fooTotalCount = repository.countAllByBar("...");

Page<FooEntity> fooPage = PageableExecutionUtils.getPage(fooList, pageable, () -> fooTotalCount);

“您的解决方法中的错误是您的自定义查询。在Spring Data JDBC 2.0中,您不需要使用它,除了特殊查询,但它们不支持pageables。”

可以找到可能的参数:

https://docs.spring.io/spring-data/jdbc/docs/current/reference/html/#jdbc.query-methods

感谢德克,

我还找到了一个解决方法来使用自定义查询运行它。只需使用限制、偏移和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, ....