Spring data JDB C создание запроса с разбивкой на страницы жалуется на IncorrectResultSizeDataAccessException: неправильный размер результата - PullRequest
1 голос
/ 02 августа 2020

Я изо всех сил пытаюсь попробовать функцию разбивки на страницы, как описано в справочном документе . Это моя схема таблицы:

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-jdb c (2.0.2.RELEASE).

1 Ответ

4 голосов
/ 05 августа 2020

Я не знаю технических деталей, но это то, что я узнал на собственном опыте.

В вашем случае, если общее количество городов меньше, чем pageable.getPageSize (), то ваш репозиторий вернет List <>.

Но если общее количество городов больше, чем pageable.getPageSize (), тогда ваш репозиторий вернет Page <>.

Зная это, это то, что Я сделал это, чтобы обойти это. параметр.

...