gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:37:41 24 4
gpt4 key购买 nike

所以,这是 native 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 接口(interface)和 @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:具有该名称[值]的参数不存在,因为显然,不允许您在带引号的字符串内使用参数(命名或索引)。不确定这是 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);

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

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

关于java - @Query 注释和带引号的字符串中的命名参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53089946/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com