From fdda1f9c4e7e8ee938ec7761f93b39166d142eaf 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() {