diff --git a/spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Hql.g4 b/spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Hql.g4 index 6d6f7567d..7984d4881 100644 --- a/spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Hql.g4 +++ b/spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Hql.g4 @@ -737,6 +737,7 @@ reservedWord | EXCEPT | EXCLUDE | EXISTS + | EXP | EXTRACT | FETCH | FILTER diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/HqlQueryRendererTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/HqlQueryRendererTests.java index 7b903cb1c..a4451f84c 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/HqlQueryRendererTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/HqlQueryRendererTests.java @@ -18,11 +18,15 @@ package org.springframework.data.jpa.repository.query; import static org.assertj.core.api.Assertions.*; import static org.springframework.data.jpa.repository.query.JpaQueryParsingToken.*; +import java.util.stream.Stream; + import org.antlr.v4.runtime.CharStreams; import org.antlr.v4.runtime.CommonTokenStream; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.ValueSource; /** @@ -57,6 +61,10 @@ class HqlQueryRendererTests { return render(new HqlQueryRenderer().visit(parsedQuery)); } + public static Stream reservedWords() { + return Stream.of("abs", "exp", "any", "case", "else", "index", "time").map(Arguments::of); + } + private void assertQuery(String query) { String slimmedDownQuery = reduceWhitespace(query); @@ -1661,4 +1669,12 @@ class HqlQueryRendererTests { void signedExpressionsShouldWork(String query) { assertQuery(query); } + + @ParameterizedTest // GH-3451 + @MethodSource({"reservedWords"}) + void entityNameWithPackageContainingReservedWord(String reservedWord) { + + String source = "select new com.company.%s.thing.stuff.ClassName(e.id) from Experience e".formatted(reservedWord); + assertQuery(source); + } }