使用分页创建 Spring 数据 JDBC 查询会提示 IncorrectResultSizeDataAccessException : Incorrect result size

标签 spring pagination spring-data spring-data-jdbc

我正在努力尝试分页功能,如 reference document 中所述.
这是我的表架构:

CREATE TABLE cities
(
    id      int PRIMARY KEY,
    name    varchar(255),
    pref_id int
);

存储库:

public interface CityRepository extends CrudRepository<CityEntity, Integer> {

  Page<CityEntity> findAll(Pageable pageable);

  // get all cities in the prefecture
  Page<CityEntity> findByPrefId(Integer prefId, Pageable pageable);
}

测试代码:

Page<CityEntity> allCities = repository.findAll(PageRequest.of(0, 10));
Page<CityEntity> cities = repository.findByPrefId(1, PageRequest.of(0, 10));

findAll运行良好,但 findByPrefId 抛出以下错误:

Incorrect result size: expected 1, actual 10
org.springframework.dao.IncorrectResultSizeDataAccessException: Incorrect result size: expected 1, actual 10
    at org.springframework.dao.support.DataAccessUtils.nullableSingleResult(DataAccessUtils.java:100)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.queryForObject(NamedParameterJdbcTemplate.java:237)
    at org.springframework.data.jdbc.repository.query.AbstractJdbcQuery.lambda$singleObjectQuery$1(AbstractJdbcQuery.java:115)
    at org.springframework.data.jdbc.repository.query.PartTreeJdbcQuery.execute(PartTreeJdbcQuery.java:98)
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor$QueryMethodInvoker.invoke(QueryExecutorMethodInterceptor.java:195)
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:152)
    at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:130)
...

如果我将方法签名更改为 List<CityEntity> findByPrefId(Integer prefId, Pageable pageable) , 它有效。

我错过了什么吗?我正在使用最新版本的 spring-data-jdbc (2.0.2.RELEASE)。

最佳答案

我不知道技术细节,但这是我从经验中学到的。

在您的情况下,如果城市总数小于 pageable.getPageSize(),那么您的存储库将返回一个列表<>。

但是如果城市总数大于 pageable.getPageSize() 那么您的存储库将返回一个 Page<>。

知道这一点后,我就是这样做的。

    Long amount = repository.countByPrefId(prefId);
    if(pagination.getPageSize()>amount ) {
       List<CityEntity> list = repository.findByPrefId(prefId);
    } else {
       Page<CityEntity> pages = repository.findByPrefId(person, PageRequest.of(0, 10));
    }

这也意味着在您的存储库中您将有两种不同的方法,一种以 Pageable 作为参数,另一种以 only PrefId 作为参数。

关于使用分页创建 Spring 数据 JDBC 查询会提示 IncorrectResultSizeDataAccessException : Incorrect result size,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63212986/

相关文章:

java - spring threadpooltaskexecutor导致tomcat内存泄漏

sql - Oracle 查询中使用行限制子句的重复列

javascript - JQuery 禁用按钮

objective-c - UITableView 中分页实现的查询

java - 使用 Jackson 将 Map 转换为 JSON

java - 在没有 ModelAndView 的 Spring MVC 4 中以 301 状态重定向

java - QueryByExampleExecutor<T>接口(interface)方法在Spring data JPA中的使用案例

java - 为什么 Spring 不允许读操作排他锁?

spring - 在 TestRestTemplate 中启用 Cookie 和重定向

java - Spring Data,获取行ManyToOne/OneToMany关系?