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

MySQL LIKE查询匹配含&数据失效,Hibernate createNativeQuery场景

问题根因

该问题由Hibernate低版本对原生SQL中&符号的特殊解析逻辑导致:
部分旧版Hibernate会将&识别为和:作用一致的命名参数前缀:

  • 执行like '%A&M%'时,&M会被Hibernate识别为名为M的命名参数,未给M参数赋值时,Hibernate会错误将该部分替换为单个任意字符通配符_,最终实际执行的SQL变为like '%A_M%',因此会匹配到所有A加任意单个字符加M的记录
  • 执行like '%A&Mohan%'时,&Mohan不符合Hibernate默认的短命名参数匹配规则(旧版Hibernate默认仅识别长度<=3的参数名),不会被误解析,因此语句可以正常执行
解决方案

推荐按优先级选择以下方案:

  • 最优方案:使用参数绑定传值,不要把模糊匹配的模式硬编码在SQL语句中,既可以避免符号解析异常,还能防止SQL注入:
// 示例代码
String matchPattern = "%A&M%";
Query nativeQuery = session.createNativeQuery("select name from students where name like ?1");
nativeQuery.setParameter(1, matchPattern);
List result = nativeQuery.getResultList();
  • 临时修复方案:如果不方便修改参数绑定逻辑,可以用MySQL内置函数拼接出&符号,避免SQL中直接出现&:
    将原语句中的'%A&M%'替换为concat('%', 'A', char(38), 'M', '%')即可,char(38)是&符号的ASCII编码,不会被Hibernate误解析。
  • 全局修复方案:如果项目中所有原生SQL都不需要使用&作为命名参数前缀,可以在Hibernate核心配置中添加以下配置关闭该解析规则:
<property name="hibernate.query.allow_ampersand_as_parameter_prefix" value="false"/>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 19:24:03