You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 16:45:30