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 f59aeb5857..8dbbb3b07e 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 @@ -81,6 +81,7 @@ * @author Mohammad Hewedy * @author Andriy Redko * @author Peter Großmann + * @author Simon Paradies */ public abstract class QueryUtils { @@ -179,7 +180,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 9855fbea6a..844ce89e1c 100644 --- a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java @@ -90,6 +90,7 @@ * @author Kevin Peters * @author Jens Schauder * @author Andrey Kovalev + * @author Simon Paradies */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:application-context.xml") @@ -2116,6 +2117,16 @@ public void handlesCountQueriesWithLessParametersMoreThanOneIndexed() { repository.findAllOrderedBySpecialNameMultipleParamsIndexed("Oliver", "x", PageRequest.of(2, 3)); } + @Test // DATAJPA-1750 + public void correctlyBuildSortClauseWhenSortingByFunctionAliasAndFunctionContainsPositionalParameters() { + repository.findAllAndSortByFunctionResultPositionalParameter("prefix", "suffix", Sort.by("idWithPrefixAndSuffix")); + } + + @Test // DATAJPA-1750 + public void correctlyBuildSortClauseWhenSortingByFunctionAliasAndFunctionContainsNamedParameters() { + repository.findAllAndSortByFunctionResultNamedParameter("prefix", "suffix", Sort.by("idWithPrefixAndSuffix")); + } + // DATAJPA-928 @Test public void executeNativeQueryWithPage() { 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 076235e282..329352eaf5 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 @@ -53,6 +53,7 @@ * @author Jeff Sheets * @author Andrey Kovalev * @author JyotirmoyVS + * @author Simon Paradies */ public interface UserRepository extends JpaRepository, JpaSpecificationExecutor, UserRepositoryCustom { @@ -577,6 +578,17 @@ Page findAllOrderedBySpecialNameMultipleParams(@Param("name") String name, value = "SELECT u FROM User u WHERE ?2 = 'x' ORDER BY CASE WHEN (u.firstname >= ?1) THEN 0 ELSE 1 END, u.firstname") Page findAllOrderedBySpecialNameMultipleParamsIndexed(String name, String other, Pageable page); + // DATAJPA-1750 + @Query("select concat(?1,u.id,?2) as idWithPrefixAndSuffix from #{#entityName} u") + List findAllAndSortByFunctionResultPositionalParameter( + @Param("positionalParameter1") String positionalParameter1, + @Param("positionalParameter2") String positionalParameter2, Sort sort); + + // DATAJPA-1750 + @Query("select concat(:namedParameter1,u.id,:namedParameter2) as idWithPrefixAndSuffix from #{#entityName} u") + List findAllAndSortByFunctionResultNamedParameter(@Param("namedParameter1") String namedParameter1, + @Param("namedParameter2") String namedParameter2, Sort sort); + // DATAJPA-928 Page findByNativeNamedQueryWithPageable(Pageable pageable);