【发布时间】:2019-04-05 00:12:12
【问题描述】:
所以,这里是本地 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 注释用于我的自定义 fetch 方法,如下所示:
@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,但这是事实。
【问题讨论】:
-
您有一个字符串文字
'{\"key\" : \"key1\", \"value\" : :value}'... 并且参数在其中,因此被视为字符串文字而不是参数。该消息会告诉您这一点。
标签: java mysql spring-boot spring-data-jpa jpql