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
相关产品推荐
相关产品推荐

