From da37737c227b3cd83bd004cde73eca30af079d58 Mon Sep 17 00:00:00 2001 From: "Greg L. Turnquist" Date: Mon, 22 May 2023 14:29:31 -0500 Subject: [PATCH] Properly implement handling sort items. See #2962 Original Pull Request: #2965 --- .../data/jpa/repository/query/Hql.g4 | 6 +--- .../repository/query/HqlQueryRenderer.java | 22 ++------------- .../query/HqlQueryRendererTests.java | 28 +++++++++++++++++++ 3 files changed, 31 insertions(+), 25 deletions(-) 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 c429687b7..80af871fc 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 @@ -139,10 +139,6 @@ values : '(' expression (',' expression)* ')' ; -projectedItem - : (expression | instantiation) alias? - ; - instantiation : NEW instantiationTarget '(' instantiationArguments ')' ; @@ -254,7 +250,7 @@ groupByClause ; orderByClause - : ORDER BY projectedItem (',' projectedItem)* + : ORDER BY sortedItem (',' sortedItem)* ; havingClause diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryRenderer.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryRenderer.java index f613352d6..1adfa1421 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryRenderer.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryRenderer.java @@ -457,24 +457,6 @@ class HqlQueryRenderer extends HqlBaseVisitor> { return tokens; } - @Override - public List visitProjectedItem(HqlParser.ProjectedItemContext ctx) { - - List tokens = new ArrayList<>(); - - if (ctx.expression() != null) { - tokens.addAll(visit(ctx.expression())); - } else if (ctx.instantiation() != null) { - tokens.addAll(visit(ctx.instantiation())); - } - - if (ctx.alias() != null) { - tokens.addAll(visit(ctx.alias())); - } - - return tokens; - } - @Override public List visitInstantiation(HqlParser.InstantiationContext ctx) { @@ -858,8 +840,8 @@ class HqlQueryRenderer extends HqlBaseVisitor> { tokens.add(new JpaQueryParsingToken(ctx.ORDER())); tokens.add(new JpaQueryParsingToken(ctx.BY())); - ctx.projectedItem().forEach(projectedItemContext -> { - tokens.addAll(visit(projectedItemContext)); + ctx.sortedItem().forEach(sortedItemContext -> { + tokens.addAll(visit(sortedItemContext)); NOSPACE(tokens); tokens.add(TOKEN_COMMA); }); 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 c161fd5ea..672c65aba 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 @@ -1430,4 +1430,32 @@ class HqlQueryRendererTests { "order by p " + // "limit 50"); } + + @Test // GH-2962 + void orderByWithNullsFirstOrLastShouldWork() { + + assertThatNoException().isThrownBy(() -> { + parseWithoutChanges(""" + select a, + case + when a.geaendertAm is null then a.erstelltAm + else a.geaendertAm end as mutationAm + from Element a + where a.erstelltDurch = :variable + order by mutationAm desc nulls first + """); + }); + + assertThatNoException().isThrownBy(() -> { + parseWithoutChanges(""" + select a, + case + when a.geaendertAm is null then a.erstelltAm + else a.geaendertAm end as mutationAm + from Element a + where a.erstelltDurch = :variable + order by mutationAm desc nulls last + """); + }); + } }