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

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做更定制化的配置,可以自定义方言类,覆盖默认的转义行为:

  1. 创建自定义方言类:
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;
    }
}
  1. 在配置文件中指定自定义方言:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 03:42:48