Аннотация @Query и именованные параметры в строках в кавычках - PullRequest
0 голосов
/ 31 октября 2018

Итак, вот собственный запрос MySQL, в котором я хочу получить все строки, основанные на парах ключ-значение JSON (ev_data тип json столбец), и он прекрасно работает:

SELECT * FROM event WHERE JSON_CONTAINS(ev_data, '{"key":"key1","value":"val1"}','$.items')

Пример содержания столбца ev_data:

{"items":[{"key":"key1","value":"val1"},{"key":"key2","value":"val2"}]}

Теперь я использую интерфейс Spring Boot CrudRepository и аннотацию @Query для своего метода выборки следующим образом:

@Query(value="SELECT * FROM event WHERE JSON_CONTAINS(ev_data, '{\"key\" : \"key1\", \"value\" : :value}', '$.items')", nativeQuery=true)
Set<Event> findAllByItemKey1Value(@Param("value") String value);

Это, однако, не сработает и вызовет исключение, подобное: java.lang.IllegalArgumentException: Parameter with that name [value] did not exist потому что, очевидно, вам не разрешено использовать параметры (именованные или индексированные) внутри строк в кавычках . Не уверен, что это JPA / JPQL или Spring Boot, но это факт.

1 Ответ

0 голосов
/ 31 октября 2018

Единственное решение, которое я нашел до сих пор, это использование строки MySQL REPLACE() function:

@Query(value="SELECT * FROM event WHERE JSON_CONTAINS(ev_data, REPLACE('{\"key\" : \"key1\", \"value\" : \"*v*\"}','*v*', :value), '$.items')", nativeQuery=true)
Set<Event> findAllByItemKey1Value(@Param("value") String value);

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

В любом случае, пожалуйста, дайте мне знать, если вы думаете, что это можно сделать лучше или лучше кошерный , так сказать; -)

...