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

Spring Boot中Criteria Builder LIKE子句转义字符报错问题咨询

问题分析与解决

你遇到的问题并非Hibernate Bug,而是使用like方法时转义字符的处理方式不符合PostgreSQL的语法要求。PostgreSQL要求ESCAPE子句后的字符必须用单引号包裹,而你当前调用cb.like(..., '\\')时,Hibernate生成的SQL直接输出了escape \,缺少单引号导致语法错误。

解决方法

方法一:使用cb.literal()传递转义字符

将转义字符通过CriteriaBuilder.literal()方法传入,让Hibernate自动处理SQL生成的格式:

String searchTerm = "\\_";
cb.like(root.get("name"), "%" + searchTerm + "%", cb.literal('\\'));

这样生成的SQL会自动将转义字符用单引号包裹,最终得到符合PostgreSQL语法的语句:

select name from project where name like ? escape '\'

方法二:手动处理模式字符串(不推荐)

如果不想指定escape参数,可以提前将模式字符串中的特殊字符手动转义,然后使用不带转义参数的like方法:

// 手动转义下划线,此时不需要指定escape字符
String searchTerm = "\\_";
cb.like(root.get("name"), "%" + searchTerm + "%");

但这种方式需要你自行处理所有SQL通配符(%、_)的转义,容易遗漏,不如方法一可靠。

原理说明

Hibernate的like重载方法中,直接传入char类型的转义字符时,会直接将字符拼接到SQL中,没有对特殊字符(如反斜杠)进行额外处理;而使用cb.literal()会将该字符作为参数处理,自动添加单引号并完成转义,从而生成符合PostgreSQL要求的SQL语法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 18:14:50