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

