From b2f891f53cf1802a9aedd7487906ceb4005148a1 Mon Sep 17 00:00:00 2001 From: "Greg L. Turnquist" Date: Thu, 19 May 2022 17:04:30 -0500 Subject: [PATCH] Fix order by clauses for functions with positional and named arguments. Related: #2045. Closes #425. --- .../data/jpa/repository/query/QueryUtils.java | 3 ++- .../data/jpa/repository/UserRepositoryTests.java | 15 ++++++++++++++- .../jpa/repository/sample/UserRepository.java | 12 ++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java b/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java index d7f90bdae..e4029861c 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java @@ -77,6 +77,7 @@ import org.springframework.util.StringUtils; * @author Diego Krupitza * @author Jędrzej Biedrzycki * @author Darin Manica + * @author Simon Paradies */ public abstract class QueryUtils { @@ -182,7 +183,7 @@ public abstract class QueryUtils { builder = new StringBuilder(); // any function call including parameters within the brackets - builder.append("\\w+\\s*\\([\\w\\.,\\s'=]+\\)"); + builder.append("\\w+\\s*\\([\\w\\.,\\s'=:\\\\?]+\\)"); // the potential alias builder.append("\\s+[as|AS]+\\s+(([\\w\\.]+))"); diff --git a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java index 6a2b6b0a6..863a60eb6 100644 --- a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java @@ -94,7 +94,10 @@ import org.springframework.transaction.annotation.Transactional; * @author Andrey Kovalev * @author Sander Krabbenborg * @author Jesse Wouters - * @author Greg Turnquist + * @author Greg Turnquist <<<<<<< HEAD ======= + * @author Diego Krupitza + * @author Daniel Shuy + * @author Simon Paradies >>>>>>> 0cef764d (Fix order by clauses for functions with positional and named arguments.) */ @ExtendWith(SpringExtension.class) @ContextConfiguration("classpath:application-context.xml") @@ -2656,6 +2659,16 @@ public class UserRepositoryTests { assertThat(repository.findAllInterfaceProjectedBy()).hasSize(4); } + @Test // GH-2045, GH-425 + public void correctlyBuildSortClauseWhenSortingByFunctionAliasAndFunctionContainsPositionalParameters() { + repository.findAllAndSortByFunctionResultPositionalParameter("prefix", "suffix", Sort.by("idWithPrefixAndSuffix")); + } + + @Test // GH-2045, GH-425 + public void correctlyBuildSortClauseWhenSortingByFunctionAliasAndFunctionContainsNamedParameters() { + repository.findAllAndSortByFunctionResultNamedParameter("prefix", "suffix", Sort.by("idWithPrefixAndSuffix")); + } + private Page executeSpecWithSort(Sort sort) { flushTestUsers(); diff --git a/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java b/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java index e176cca13..32ca93f16 100644 --- a/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java +++ b/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java @@ -54,6 +54,7 @@ import org.springframework.transaction.annotation.Transactional; * @author Andrey Kovalev * @author JyotirmoyVS * @author Greg Turnquist + * @author Simon Paradies */ public interface UserRepository extends JpaRepository, JpaSpecificationExecutor, UserRepositoryCustom { @@ -625,6 +626,17 @@ public interface UserRepository // GH-2408 List findAllInterfaceProjectedBy(); + // GH-2045, GH-425 + @Query("select concat(?1,u.id,?2) as idWithPrefixAndSuffix from #{#entityName} u") + List findAllAndSortByFunctionResultPositionalParameter( + @Param("positionalParameter1") String positionalParameter1, + @Param("positionalParameter2") String positionalParameter2, Sort sort); + + // GH-2045, GH-425 + @Query("select concat(:namedParameter1,u.id,:namedParameter2) as idWithPrefixAndSuffix from #{#entityName} u") + List findAllAndSortByFunctionResultNamedParameter(@Param("namedParameter1") String namedParameter1, + @Param("namedParameter2") String namedParameter2, Sort sort); + interface RolesAndFirstname { String getFirstname();