Собственный запрос с параметрами, использующими @Query в Hibernate - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь параметризовать метод @Query для MariaDb 10.3, используя последовательность с именем F0001

Вкл. этот урок , в разделе 5.2 есть этот пример

5,2. Родные Индексированные параметры для собственных запросов работают точно так же, как и для JPQL:

@Query(
  value = "SELECT * FROM Users u WHERE u.status = ?1", 
  nativeQuery = true)
User findUserByStatusNative(Integer status);

Но когда я пытаюсь сделать то же самое (используя последовательность)

@Query(value = "SELECT NEXTVAL(?1)", nativeQuery = true)
Long getNextSequenceByFleetId(String fleetId);

Это не работает для меня, хотя последовательность правильно установлена ​​в БД.

SELECT NEXTVAL(F0001)  --> returns nextval 2

Что мне здесь не хватает?

Спасибо.

PS: я видел этот пост , но примеры не используют аннотацию @Query.


ОБНОВЛЕНИЕ:

Следуя предложениям @JB Nizet в комментариях, я попытался использовать SpEL:

https://spring.io/blog/2014/07/15/spel-support-in-spring-data-jpa-query-definitions

@Query("select u from User u where u.age = ?#{[0]}")
List<User> findUsersByAge(int age);

Я пробовал следующее:

@Query(value = "SELECT NEXTVAL(?#{[0]})", nativeQuery = true)
Long getNextSequenceByFleetId(String fleetId);

но увы ...

You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''F0001')' at line 1

1 Ответ

0 голосов
/ 18 сентября 2018

Дж. Б. Низет дал вам правильный ответ.

Вы можете передавать значения в качестве параметров запроса. Но не имена таблиц, столбцов или последовательностей. База данных нуждается в этой информации, чтобы подготовить план для запроса.

К сожалению, «трюк» со SpEL не работает. SpEL переводятся в параметры связывания, поэтому применяются те же ограничения. Из этого правила есть одно исключение, когда выражение SpEL просто использует имя объекта, как в этом примере, взятом из интеграционных тестов JPA Spring Data :

@Query("update #{#entityName} u set u.active = :activeState where u.id in :ids")
void updateUserActiveState(@Param("activeState") boolean activeState, @Param("ids") Integer... ids);

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

Что вы, вероятно, могли бы сделать, это вызвать хранимую процедуру, которая выполняет запрос к последовательности на основе параметра.

...