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

如何在Hibernate中正确构造MySQL JSON_CONTAINS查询语句

解决Hibernate中JSON_CONTAINS的语法错误问题

你这段代码的问题出在JSON_CONTAINS(zipCodes, zipCodes=:zipCode )这个部分的语法上——你错误地把参数写成了一个比较表达式,而不是直接传递要匹配的JSON值,这才导致HQL解析器抛出了AST节点异常。

下面给你两种正确的实现方式,都能复现你在MySQL里的查询效果:

方式1:手动构造JSON格式的参数值

因为你的zipCodes字段存储的是数字数组,MySQL的JSON_CONTAINS可以接受字符串形式的数字作为匹配值(就像你原来的SQL语句那样),所以可以直接给参数加上引号,让它符合JSON格式:

session.createQuery("from ZipCodes where JSON_CONTAINS(zipCodes, :zipCode)")
       .setParameter("zipCode", "\"" + zipCode + "\"")
       .getResultList();

这里要注意,我们给zipCode值前后加了双引号,确保它是一个合法的JSON值(如果你存储的是纯数字数组,也可以直接传数字,但用引号更稳妥,能适配不同的JSON类型场景)。

方式2:使用MySQL的JSON_QUOTE函数(更推荐)

手动拼接引号容易出现格式错误,更规范的做法是借助MySQL的JSON_QUOTE函数自动处理参数的JSON格式转换,这样不管你的zipCode是数字还是字符串,都能正确生成符合要求的JSON值:

session.createQuery("from ZipCodes where JSON_CONTAINS(zipCodes, JSON_QUOTE(:zipCode))")
       .setParameter("zipCode", zipCode)
       .getResultList();

这个写法和你原来的MySQL查询逻辑完全一致,而且更安全,避免了手动拼接字符串可能带来的问题。

简单总结下:你之前的错误是把JSON_CONTAINS的第二个参数写成了zipCodes=:zipCode,这是完全不符合语法的——这个位置需要的是要匹配的目标JSON值,而不是一个比较条件。上面两种写法都能解决这个问题,推荐用第二种方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:49:55