【问题标题】:@Query annotation and named parameters in quoted strings@Query 注释和带引号的字符串中的命名参数
【发布时间】: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


【解决方案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);

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

无论如何,如果您认为这可以做得更好或更好,请告诉我kosher,可以这么说;-)

【讨论】:

  • 聪明的破解!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 2013-06-19
  • 1970-01-01
  • 2019-11-20
  • 1970-01-01
  • 2018-09-14
相关资源
最近更新 更多