@Query注释和带引号的字符串中的命名参数

时间:2018-10-31 18:32:49

标签: java mysql spring-boot spring-data-jpa jpql

因此,这是本机MySQL查询,我想在其中获取基于JSON键值对(ev_data为json type列)的所有行,并且工作正常:

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 :(得分:1)

到目前为止,我发现的唯一解决方法是使用MySQL字符串REPLACE()函数:

@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);

这不是很优雅,但它对我有用,类似的技巧也适用于引号内使用的任何命名参数。

无论如何,请告诉我您是否认为可以做得更好或更多洁净,可以这么说;-)