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

Spring JPA结合MariaDB生成无效SQL问题求助

问题

我用Spring Boot搭配MariaDB,依赖配置如下:

<dependency>
    <groupId>org.mariadb.jdbc</groupId>
    <artifactId>mariadb-java-client</artifactId>
    <version>3.3.0</version>
</dependency>

定义了JPA Repository方法:

List<Plugin> findAllByPalpUrlStartingWith(
    String palpUrl
);

但应用运行时生成了无效SQL:

select * 
from remote_plugins p1_0  
where p1_0.palp_url like 'test' escape '\';

反斜杠转义了引号,导致字符串没闭合。我搞不懂ESCAPE子句的作用,MariaDB文档里也没提相关内容,现在想强制JPA给startingWith场景生成正确的SQL,比如完全禁用ESCAPE功能?


解决方案

1. 自定义JPQL查询,手动控制LIKE逻辑

直接在Repository方法上定义JPQL,绕过自动生成的ESCAPE逻辑:

@Query("SELECT p FROM Plugin p WHERE p.palpUrl LIKE CONCAT(:palpUrl, '%')")
List<Plugin> findAllByPalpUrlStartingWith(@Param("palpUrl") String palpUrl);

这种方式完全由你掌控SQL的LIKE部分,不会出现自动添加的ESCAPE子句。

2. 全局配置Hibernate取消LIKE转义

如果你的Spring Data JPA底层用的是Hibernate,直接在配置文件中添加以下配置:

# application.properties
spring.jpa.properties.hibernate.query.like_escape_char=

或者yaml格式:

# application.yml
spring:
  jpa:
    properties:
      hibernate:
        query:
          like_escape_char: ''

把转义字符设为空后,Hibernate生成LIKE语句时就不会额外添加ESCAPE子句了。

3. 使用@Escape注解指定空转义字符(Spring Data JPA 2.5+可用)

如果你的Spring Data JPA版本在2.5及以上,直接给方法参数加上@Escape("")注解:

List<Plugin> findAllByPalpUrlStartingWith(
    @Escape("") String palpUrl
);

这样生成SQL时会用空字符串作为转义字符,自然就不会出现那个导致语法错误的ESCAPE子句了。


补充说明:ESCAPE是SQL标准语法,用来指定转义字符——当你要匹配的字符串里有%或_这类通配符时,可用转义字符将它们转为普通字符。但MariaDB默认就用反斜杠做转义,根本不需要额外添加ESCAPE子句,JPA自动生成反而引发了语法问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 15:44:58