From a5ab19230f092d7d0c4c25a1f03dae4b2bf22dac Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 11 Dec 2023 10:44:08 +0100 Subject: [PATCH] Render entire statement after applying sort. This commit makes sure to render the entire statement after applying the sort expression via the QueryEnhancer. Previously only parts, the actual statement body, had been considered. Closes: #3263 Original Pull Request: #3264 --- .../jpa/repository/query/JSqlParserQueryEnhancer.java | 2 +- .../jpa/repository/query/QueryEnhancerUnitTests.java | 11 +++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JSqlParserQueryEnhancer.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JSqlParserQueryEnhancer.java index 03a92fed5..7b885b98e 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JSqlParserQueryEnhancer.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JSqlParserQueryEnhancer.java @@ -141,7 +141,7 @@ public class JSqlParserQueryEnhancer implements QueryEnhancer { selectBody.getOrderByElements().addAll(orderByElements); - return selectBody.toString(); + return selectStatement.toString(); } diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/QueryEnhancerUnitTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/QueryEnhancerUnitTests.java index 6140b313b..b2956cc74 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/QueryEnhancerUnitTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/QueryEnhancerUnitTests.java @@ -179,6 +179,17 @@ class QueryEnhancerUnitTests { assertThat(query).endsWithIgnoringCase("ORDER BY p.firstname, p.lastname asc"); } + @Test // GH-3263 + void preserveSourceQueryWhenAddingSort() { + + StringQuery query = new StringQuery("WITH all_projects AS (SELECT * FROM projects) SELECT * FROM all_projects p", + true); + + assertThat(getEnhancer(query).applySorting(Sort.by("name"), "p")) // + .startsWithIgnoringCase(query.getQueryString()) + .endsWithIgnoringCase("ORDER BY p.name ASC"); + } + @Test // GH-2812 void createCountQueryFromDeleteQuery() {