Skip to content

Commit 2929e01

Browse files
christophstroblmp911de
authored andcommitted
Fix parsing entity names in HQL query with package names that contain reserved exp keyword.
Resolves: #3451 Original pull request: #3457
1 parent 785f9f5 commit 2929e01

File tree

2 files changed

+17
-0
lines changed
  • spring-data-jpa/src

2 files changed

+17
-0
lines changed

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

+1
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,7 @@ reservedWord
737737
| EXCEPT
738738
| EXCLUDE
739739
| EXISTS
740+
| EXP
740741
| EXTRACT
741742
| FETCH
742743
| FILTER

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

+16
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,15 @@
1818
import static org.assertj.core.api.Assertions.*;
1919
import static org.springframework.data.jpa.repository.query.JpaQueryParsingToken.*;
2020

21+
import java.util.stream.Stream;
22+
2123
import org.antlr.v4.runtime.CharStreams;
2224
import org.antlr.v4.runtime.CommonTokenStream;
2325
import org.junit.jupiter.api.Disabled;
2426
import org.junit.jupiter.api.Test;
2527
import org.junit.jupiter.params.ParameterizedTest;
28+
import org.junit.jupiter.params.provider.Arguments;
29+
import org.junit.jupiter.params.provider.MethodSource;
2630
import org.junit.jupiter.params.provider.ValueSource;
2731

2832
/**
@@ -57,6 +61,10 @@ private static String parseWithoutChanges(String query) {
5761
return render(new HqlQueryRenderer().visit(parsedQuery));
5862
}
5963

64+
public static Stream<Arguments> reservedWords() {
65+
return Stream.of("abs", "exp", "any", "case", "else", "index", "time").map(Arguments::of);
66+
}
67+
6068
private void assertQuery(String query) {
6169

6270
String slimmedDownQuery = reduceWhitespace(query);
@@ -1661,4 +1669,12 @@ void signedLiteralShouldWork(String query) {
16611669
void signedExpressionsShouldWork(String query) {
16621670
assertQuery(query);
16631671
}
1672+
1673+
@ParameterizedTest // GH-3451
1674+
@MethodSource({"reservedWords"})
1675+
void entityNameWithPackageContainingReservedWord(String reservedWord) {
1676+
1677+
String source = "select new com.company.%s.thing.stuff.ClassName(e.id) from Experience e".formatted(reservedWord);
1678+
assertQuery(source);
1679+
}
16641680
}

0 commit comments

Comments
 (0)