Пользовательский запрос Spring Data JDBC с параметром заказа не работает

Я пытаюсь заказать свой индивидуальный запрос с таким специальным параметром:

@Query("select * from person where firstname = :name" + " order by :order")
List<Customer> findByFirstNameCustomQuery2(@Param("name") String name, Pageable page,
@Param("order") String order);

Но это не работает.

Кто-нибудь знает, как использовать заказ в качестве параметра внутри @Query?

примечание: как указано ниже, я создал репозиторий github. Вы можете найти его здесь: https://github.com/kremerkp/spring-data-jdbc-pageable-h2.

CustomerRepository выполняет пять функций. findByLastName - это полнофункциональный пример (с возможностью сортировки и страницы), в котором используются функции запроса.

В моем реальном проекте у меня есть запрос, который слишком сложно использовать с функциями запроса, поэтому мне нужно получить результат с помощью специального запроса.


person eyeprime    schedule 06.08.2020    source источник


Ответы (1)


Этот конкретный случай можно решить без специального запроса, просто используя атрибут Sort для Pageable. Вы должны иметь возможность использовать Page в качестве возвращаемого типа метода, но из-за ошибки https://jira.spring.io/projects/DATAJDBC/issues/DATAJDBC-554 в настоящее время (по состоянию на Spring Data JDBC 2.0.2.RELEASE) невозможно.

Однако вы можете создать метод, возвращающий List, и передать ему объект Pageable:

List<Customer> findByFirstName(String name, Pageable page);

Хотя метод возвращает List, разбивка на страницы и сортировка по-прежнему должны применяться, поэтому список содержит только данные с одной страницы, отсортированные по запросу:

repository.findByFirstName("Foo", 
  PageRequest.of(0, 1, Sort.by(Sort.Direction.ASC, "someSortField"));
person Sergei    schedule 06.08.2020
comment
Извините, я пропустил, что использую Spring Data JDBC. Итак, я не смогу использовать Page ‹Customer› в качестве возвращаемого значения внутри репозитория. Я верну список клиентов. Я думаю, что одним из вариантов может быть использование настраиваемого компаратора, но есть более удобный способ сделать это. - person eyeprime; 07.08.2020
comment
@eyeprime на самом деле сортировка и разбиение на страницы поддерживаются начиная с Spring Data JDBC 2.0: docs.spring.io/spring-data/jdbc/docs/2.0.2.RELEASE/reference/ - person Sergei; 07.08.2020
comment
Сергей, я использую Release 2.1. данных Spring. Описанное вами решение приводит к исключению java.lang.ClassCastException. Я создал небольшой проект GitHub на основе данных загрузки jdbc и базы данных h2 для демонстрации. Репо работает напрямую, настраивать особо нечего. Не стесняйтесь сделать запрос на перенос и показать свое решение там. - person eyeprime; 09.08.2020
comment
@eyeprime спасибо за репродуктор. Я только изменил версию spring-boot-starter-parent на последнюю версию 2.3.2.RELEASE. Я заметил не ClassCastException, а IncorrectResultSizeDataAccessException, что кажется известной проблемой jira.spring .io / projects / DATAJDBC / issues / DATAJDBC-554. Но я видел, что вы уже применили предложенный обходной путь в своем CustomerController.findByNameList() методе, который, кажется, работает нормально. Надеюсь, это ответ на ваш вопрос. - person Sergei; 10.08.2020