Skip to content

Commit 7428522

Browse files
committed
Handle backslash characters for LIKE ESCAPE clause.
Hibernate HQL supports using a `\\` as the ESCAPE character so we need to support it in our custom parser. See #3040
1 parent fb4214c commit 7428522

File tree

3 files changed

+10
-4
lines changed

3 files changed

+10
-4
lines changed

spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Hql.g4

+2-2
Original file line numberDiff line numberDiff line change
@@ -605,7 +605,7 @@ dealingWithNullExpression
605605

606606
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-like-predicate
607607
stringPatternMatching
608-
: expression NOT? (LIKE | ILIKE) expression (ESCAPE (character|parameter))?
608+
: expression NOT? (LIKE | ILIKE) expression (ESCAPE (stringLiteral|parameter))?
609609
;
610610

611611
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-elements-indices
@@ -1078,7 +1078,7 @@ fragment HEX_DIGIT : [0-9a-fA-F];
10781078

10791079

10801080
CHARACTER : '\'' (~ ('\'' | '\\' )) '\'' ;
1081-
STRINGLITERAL : '\'' ('\'' '\'' | ~('\'' | '\\'))* '\'' ;
1081+
STRINGLITERAL : '\'' ('\'' '\'' | ~('\''))* '\'' ;
10821082
JAVASTRINGLITERAL : '"' ( ('\\' [btnfr"']) | ~('"'))* '"';
10831083
INTEGER_LITERAL : INTEGER_NUMBER (L | B I)? ;
10841084
FLOAT_LITERAL : FLOAT_NUMBER (D | F | B D)?;

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryRenderer.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -2231,8 +2231,9 @@ public List<JpaQueryParsingToken> visitStringPatternMatching(HqlParser.StringPat
22312231
if (ctx.ESCAPE() != null) {
22322232

22332233
tokens.add(new JpaQueryParsingToken(ctx.ESCAPE()));
2234-
if (ctx.character() != null) {
2235-
tokens.addAll(visit(ctx.character()));
2234+
2235+
if (ctx.stringLiteral() != null) {
2236+
tokens.addAll(visit(ctx.stringLiteral()));
22362237
} else if (ctx.parameter() != null) {
22372238
tokens.addAll(visit(ctx.parameter()));
22382239
}

spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/HqlQueryRendererTests.java

+5
Original file line numberDiff line numberDiff line change
@@ -1544,4 +1544,9 @@ void binaryLiteralsShouldWork() {
15441544
assertQuery("SELECT ce.id FROM CalendarEvent ce WHERE ce.value = X'DEADBEEF'");
15451545
assertQuery("SELECT ce.id FROM CalendarEvent ce WHERE ce.value = x'deadbeef'");
15461546
}
1547+
1548+
@Test // GH-3040
1549+
void escapeClauseShouldWork() {
1550+
assertQuery("select t.name from SomeDbo t where t.name LIKE :name escape '\\\\'");
1551+
}
15471552
}

0 commit comments

Comments
 (0)