如何阻止Hibernate 6通过Criteria API自动转义LIKE查询中的反斜杠?
解决Hibernate 6.1中JPA Criteria API LIKE查询自动转义反斜杠的问题
问题背景
将Spring Boot 2.7(Hibernate 5.6)迁移到Spring Boot 3.0(Hibernate 6.1)后,JPA Criteria API生成的LIKE查询会自动对参数中的反斜杠进行双重转义。原本手动用\%和\_转义特殊字符的预处理逻辑失效——Hibernate会把反斜杠转成\\,导致\%变成\\%,失去对%的转义效果。
解决方案
1. 全局禁用自动转义(推荐)
在Spring Boot配置文件中添加Hibernate属性,指定空的转义字符,彻底关闭自动转义逻辑:
- application.properties
hibernate.query.like.escape.character= - application.yml
hibernate: query: like: escape: character: ""
该配置要求Hibernate版本≥6.1.4,设置后Hibernate生成的SQL会恢复到5.6的样式,不再添加replace(?, '\\', '\\\\')处理。
2. 局部指定空转义符
如果不想修改全局配置,可在单个LIKE查询中显式传入空转义符:
String searchString = "search string with escaped special chars \\% and \\_"; criteriaBuilder.like( criteriaBuilder.lower(root.get("myColumn")), searchString, "" // 空转义符禁用自动处理 );
此方式仅对当前查询生效,适合需要保留全局转义逻辑的场景。
3. 调整预处理逻辑适配新行为
放弃手动添加反斜杠转义,让Hibernate自动处理特殊字符。例如,若要精确匹配包含%或_的字符串,可直接传入原始字符串,Hibernate会自动完成转义(此方式需要调整原有业务代码中的字符串预处理逻辑)。
验证效果
应用上述方案后,生成的SQL会恢复为:
SELECT ... FROM ... WHERE lower(m1_0.`MyColumn`) like ?
手动预处理的\%和\_会正常生效,实现对%和_的精确匹配。
内容的提问来源于stack exchange,提问作者Moritz
相关产品推荐
相关产品推荐

