gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 01:16:52 26 4
gpt4 key购买 nike

我正在努力尝试分页功能,如 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com