[英]@Query annotation and named parameters in quoted strings
因此,这是本机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,但这是事实。
到目前为止,我发现的唯一解决方法是使用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);
它不是很优雅,但对我有用,类似的技巧也适用于引号内使用的任何命名参数。
无论如何,请告诉我您是否认为可以做得更好或更洁一点 ,-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.