Spring JPA Repository中JSON_CONTAINS查询引号缺失问题求助
解决Spring Repository中JSON_CONTAINS参数缺失内层引号的问题
问题场景
正常可执行的SQL语句:
SELECT * from session WHERE JSON_CONTAINS(old_callback_codes,'"OLD-CODE"')
在Spring Repository中使用原生查询注解:
@Query(nativeQuery = true, value = "SELECT * from session WHERE JSON_CONTAINS(old_callback_codes,?1)")
但实际执行时生成的SQL丢失了内层双引号:
SELECT * from session WHERE JSON_CONTAINS(old_callback_codes,'OLD-CODE')
导致JSON_CONTAINS无法正确匹配目标值。
解决方案
1. 传入参数时手动添加双引号
调用Repository方法时,直接给参数套上转义后的双引号:
// 调用示例 sessionRepository.findSessionByCallbackCode("\"OLD-CODE\"");
对应的Repository方法保持原注解不变:
@Query(nativeQuery = true, value = "SELECT * from session WHERE JSON_CONTAINS(old_callback_codes,?1)") List<Session> findSessionByCallbackCode(String code);
2. 在SQL中通过字符串拼接添加双引号
利用数据库的字符串拼接函数,在SQL里给参数包裹双引号。以MySQL为例,使用CONCAT函数:
@Query(nativeQuery = true, value = "SELECT * from session WHERE JSON_CONTAINS(old_callback_codes, CONCAT('\"', ?1, '\"'))") List<Session> findSessionByCallbackCode(String code);
如果是支持||拼接的数据库(比如PostgreSQL),可以这样写:
@Query(nativeQuery = true, value = "SELECT * from session WHERE JSON_CONTAINS(old_callback_codes, '\"' || ?1 || '\"')") List<Session> findSessionByCallbackCode(String code);
3. 通过SpEL表达式在注解中处理参数
使用Spring表达式语言(SpEL)在注解内直接把参数转换成带双引号的格式:
@Query(nativeQuery = true, value = "SELECT * from session WHERE JSON_CONTAINS(old_callback_codes, '#{\"\\\"\" + #code + \"\\\"\"}')") List<Session> findSessionByCallbackCode(@Param("code") String code);
调用时直接传入原始值OLD-CODE即可,SpEL会自动为其添加双引号。
原因说明
Spring Data处理原生SQL参数时,仅会为字符串参数自动添加外层单引号,但不会处理JSON格式要求的内层双引号。而JSON_CONTAINS要求匹配的是标准JSON字符串,必须包含双引号才能正确识别,因此需要手动补充这部分引号。
内容的提问来源于stack exchange,提问作者jdh961502
相关产品推荐
相关产品推荐

