Hibernate 6.6.1.Final中带@的命名参数绑定失效问题咨询
Hibernate 6.6.1.Final升级后带@前缀的原生查询参数绑定失败原因
这个问题的核心是Hibernate 6.6.x版本对原生SQL查询的参数解析规则做了严格的破坏性变更:
旧版本(6.4.4及更早)的行为
在6.4.4中,Hibernate的原生查询参数解析器允许参数名包含@前缀——如果你在查询语句里写:customerId,它会被识别为名为@customerId的合法命名参数,此时调用setParameter("@customerId", ...)可以正常绑定参数。新版本(6.6.1.Final)的行为
升级到6.6.x后,Hibernate的参数解析逻辑变得严格:
- 原生查询中的命名参数必须以单个冒号
:开头,冒号后必须直接跟合法的标识符(字母、下划线开头的字符串),不允许在参数名前额外添加@符号。 - 如果你在查询里写
:customerId,解析器会把:和@的组合当作普通SQL文本,而不是命名参数的标识,导致查询的参数列表为空。 - 此时你调用
setParameter("@customerId", ...),Hibernate会尝试查找名为@customerId的参数,但因为查询里没有被识别出任何命名参数,就会抛出UnknownParameterException。
- 修复方案的逻辑
当你把查询语句里的:customerId改成:customerId,并调用setParameter("customerId", ...)时,完全符合新版本的参数解析规则:冒号后紧跟合法参数名,因此Hibernate能正常识别并绑定参数,代码恢复正常。
这个变更本质上是Hibernate为了更严格地对齐SQL参数命名规范,同时避免和部分数据库原生的参数语法(比如部分数据库用@作为参数前缀)产生冲突,修复了旧版本解析器的模糊性问题。
内容的提问来源于stack exchange,提问作者Nicole Schmitz
相关产品推荐
相关产品推荐

