Итак, вот собственный запрос 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, но это факт.