Skip to content

Commit 6a2510d

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 4c263f1 commit 6a2510d

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
/**
@@ -55,6 +59,10 @@ private static String parseWithoutChanges(String query) {
5559
return render(new HqlQueryRenderer().visit(parsedQuery));
5660
}
5761

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

6068
String slimmedDownQuery = reduceWhitespace(query);
@@ -1659,4 +1667,12 @@ void signedLiteralShouldWork(String query) {
16591667
void signedExpressionsShouldWork(String query) {
16601668
assertQuery(query);
16611669
}
1670+
1671+
@ParameterizedTest // GH-3451
1672+
@MethodSource({"reservedWords"})
1673+
void entityNameWithPackageContainingReservedWord(String reservedWord) {
1674+
1675+
String source = "select new com.company.%s.thing.stuff.ClassName(e.id) from Experience e".formatted(reservedWord);
1676+
assertQuery(source);
1677+
}
16621678
}

0 commit comments

Comments
 (0)