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

