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

如何阻止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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:35:20