Spring Boot3+Hibernate6.2.5中H2 Oracle兼容模式Like查询自动转义禁用方法
解决Spring Boot 3中H2 Oracle兼容模式下JPA Criteria Like查询自动转义问题
从Spring Boot 2迁移到3后,Hibernate 6.x默认开启了Like查询的自动转义功能,导致生成的SQL多了escape ''子句,影响Oracle兼容模式下的H2数据库查询。以下是几种禁用该功能的方法:
方法一:全局关闭Hibernate Like转义配置
在application.properties或application.yml中添加以下配置,全局禁用自动生成escape子句:
spring.jpa.properties.hibernate.query.like_escape_clause=false
这个配置直接控制Hibernate是否为Like查询自动添加escape子句,是最简单的全局解决方案。
方法二:自定义H2 Oracle兼容方言
如果需要针对Oracle兼容模式的H2做更定制化的配置,可以自定义方言类,覆盖默认的转义行为:
- 创建自定义方言类:
package com.yourproject.config; import org.hibernate.dialect.H2Dialect; public class CustomH2OracleDialect extends H2Dialect { public CustomH2OracleDialect() { super(); } @Override public String getLikeEscapeString() { return ""; } @Override public boolean supportsLikeEscapeClause() { return false; } }
- 在配置文件中指定自定义方言:
spring.jpa.properties.hibernate.dialect=com.yourproject.config.CustomH2OracleDialect
注意替换com.yourproject.config为你实际的包路径。
方法三:单个Criteria查询手动禁用转义
如果只需要针对特定查询关闭转义,可以使用Criteria API的like方法重载,显式指定转义字符(或使用无转义的写法):
// 构建查询示例 CriteriaBuilder cb = entityManager.getCriteriaBuilder(); CriteriaQuery<YourEntity> query = cb.createQuery(YourEntity.class); Root<YourEntity> root = query.from(YourEntity.class); // 使用like方法的重载,指定转义字符为一个不会被使用的字符(如空格),避免自动生成escape子句 Predicate predicate = cb.like(root.get("a"), "%yourKeyword%", ' '); query.where(predicate); List<YourEntity> result = entityManager.createQuery(query).getResultList();
内容的提问来源于stack exchange,提问作者Sador La
相关产品推荐
相关产品推荐

