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

Hibernate 6.6.1.Final中带@的命名参数绑定失效问题咨询

Hibernate 6.6.1.Final升级后带@前缀的原生查询参数绑定失败原因

这个问题的核心是Hibernate 6.6.x版本对原生SQL查询的参数解析规则做了严格的破坏性变更:

  1. 旧版本(6.4.4及更早)的行为
    在6.4.4中,Hibernate的原生查询参数解析器允许参数名包含@前缀——如果你在查询语句里写:customerId,它会被识别为名为@customerId的合法命名参数,此时调用setParameter("@customerId", ...)可以正常绑定参数。

  2. 新版本(6.6.1.Final)的行为
    升级到6.6.x后,Hibernate的参数解析逻辑变得严格:

  • 原生查询中的命名参数必须以单个冒号:开头,冒号后必须直接跟合法的标识符(字母、下划线开头的字符串),不允许在参数名前额外添加@符号。
  • 如果你在查询里写:customerId,解析器会把:和@的组合当作普通SQL文本,而不是命名参数的标识,导致查询的参数列表为空。
  • 此时你调用setParameter("@customerId", ...),Hibernate会尝试查找名为@customerId的参数,但因为查询里没有被识别出任何命名参数,就会抛出UnknownParameterException。
  1. 修复方案的逻辑
    当你把查询语句里的:customerId改成:customerId,并调用setParameter("customerId", ...)时,完全符合新版本的参数解析规则:冒号后紧跟合法参数名,因此Hibernate能正常识别并绑定参数,代码恢复正常。

这个变更本质上是Hibernate为了更严格地对齐SQL参数命名规范,同时避免和部分数据库原生的参数语法(比如部分数据库用@作为参数前缀)产生冲突,修复了旧版本解析器的模糊性问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 01:26:13