Spring Data JDB C - возможность страницы в пользовательском запросе - PullRequest
0 голосов
/ 03 августа 2020

В моем проекте у меня есть репозиторий, расширяющий CrudRepository. Внутри у меня есть собственный запрос:

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

, возвращаемое значение включает полное Список «custList». Как лучше всего получить объект, доступный для страницы с указанным смещением и размером?

Одним из вариантов может быть использование

customer.subList(fromIndex, toIndex)

, но это кажется неправильным. Также из-за загрузки всех данных внутри списка вместо того, чтобы просто получать данные по размеру и смещению, как параметризованные с помощью pageable.

Примечание: в случае использования страницы внутри репозитория я получу org.springframework.dao.IncorrectResultSizeDataAccessException : Неверный размер результата: ожидаемый 1, фактический 88

Существует также открытое улучшение Jira, которое можно найти здесь: https://jira.spring.io/browse/DATAJDBC-554?filter=-3

надеюсь на помощь. ..

1 Ответ

0 голосов
/ 03 августа 2020

Я получил ответ на 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 JDB C 2.0 вам не нужно это использовать, за исключением специальных запросов, но они не будут support pageables. "

Можно найти возможные параметры:

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

Thx Dirk,

Я также нахожу обходной путь, чтобы запустить его с помощью специального запроса. Просто используйте 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, ....
...