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

Spring Boot中JPA查询MySQL表JSON列传参报错如何修复

问题根因

你在原生SQL中把参数占位符?1直接写在了JSON字符串字面量内部,Spring Data JPA的参数解析器不会识别字符串常量内部的占位符,不会完成参数值替换,最终发给MySQL执行的SQL中仍然保留?1标记,直接触发SQL语法错误。当你把值硬编码在JSON字符串里时,整个片段是完整合法的常量,所以可以正常运行。

可行修复方案

优先推荐第一种方案,没有转义风险,兼容性最好:

  • 使用MySQL内置的JSON_OBJECT函数构造待匹配的JSON片段,不需要手动拼接JSON字符串,也不存在占位符识别问题,会自动处理不同参数类型的格式、转义:
public interface MpaCustomizationRepository extends JpaRepository<MpaCustomization, Serializable> {
    @Query(nativeQuery = true, value = "select * from MPA_CUSTOMIZATION where json_contains(domain_based_properties, JSON_OBJECT('id', ?1))")
    MpaCustomization findByDomainBaseId(String domainId);
}
  • 如果不想用JSON函数,也可以通过CONCAT函数拼接JSON字符串,让占位符暴露在解析器可识别的位置,注意要根据id的类型决定是否给参数加双引号:
    数字类型id示例:
@Query(nativeQuery = true, value = "select * from MPA_CUSTOMIZATION where json_contains(domain_based_properties, CONCAT('{\"id\":', ?1, '}'))")
MpaCustomization findByDomainBaseId(Long domainId);

字符串类型id示例:

@Query(nativeQuery = true, value = "select * from MPA_CUSTOMIZATION where json_contains(domain_based_properties, CONCAT('{\"id\":\"', ?1, '\"}'))")
MpaCustomization findByDomainBaseId(String domainId);

注意:CONCAT拼接方案需要自行处理参数中的特殊字符转义,如果传入参数包含双引号、反斜杠等JSON特殊字符,会导致JSON结构非法触发报错,非必要不推荐使用。

  • 你也可以提前在Java代码层构造好合法的JSON字符串,直接把整个JSON作为参数传入查询:
@Query(nativeQuery = true, value = "select * from MPA_CUSTOMIZATION where json_contains(domain_based_properties, ?1)")
MpaCustomization findByDomainBaseId(String domainPropertiesJson);

调用方法前自行拼接/序列化出符合格式的JSON字符串即可,比如传入"{\"id\":\"你的domainId值\"}"。

内容的提问来源于stack exchange,提问作者dasitha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:45:35