Skip to content

Commit f5ddb7a

Browse files
committed
Fix order by clauses for functions with positional and named arguments.
Related: #2045. Closes #425.
1 parent e3439f3 commit f5ddb7a

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
* @author Diego Krupitza
7878
* @author Jędrzej Biedrzycki
7979
* @author Darin Manica
80+
* @author Simon Paradies
8081
*/
8182
public abstract class QueryUtils {
8283

@@ -182,7 +183,7 @@ public abstract class QueryUtils {
182183

183184
builder = new StringBuilder();
184185
// any function call including parameters within the brackets
185-
builder.append("\\w+\\s*\\([\\w\\.,\\s'=]+\\)");
186+
builder.append("\\w+\\s*\\([\\w\\.,\\s'=:\\\\?]+\\)");
186187
// the potential alias
187188
builder.append("\\s+[as|AS]+\\s+(([\\w\\.]+))");
188189

spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java

+11
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@
9595
* @author Greg Turnquist
9696
* @author Diego Krupitza
9797
* @author Daniel Shuy
98+
* @author Simon Paradies
9899
*/
99100
@ExtendWith(SpringExtension.class)
100101
@ContextConfiguration("classpath:application-context.xml")
@@ -2877,6 +2878,16 @@ void deleteWithSpec() {
28772878
assertThat(initialCount - finalCount).isEqualTo(3L);
28782879
}
28792880

2881+
@Test // GH-2045, GH-425
2882+
public void correctlyBuildSortClauseWhenSortingByFunctionAliasAndFunctionContainsPositionalParameters() {
2883+
repository.findAllAndSortByFunctionResultPositionalParameter("prefix", "suffix", Sort.by("idWithPrefixAndSuffix"));
2884+
}
2885+
2886+
@Test // GH-2045, GH-425
2887+
public void correctlyBuildSortClauseWhenSortingByFunctionAliasAndFunctionContainsNamedParameters() {
2888+
repository.findAllAndSortByFunctionResultNamedParameter("prefix", "suffix", Sort.by("idWithPrefixAndSuffix"));
2889+
}
2890+
28802891
private Page<User> executeSpecWithSort(Sort sort) {
28812892

28822893
flushTestUsers();

spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/sample/UserRepository.java

+12
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
* @author Andrey Kovalev
5555
* @author JyotirmoyVS
5656
* @author Greg Turnquist
57+
* @author Simon Paradies
5758
*/
5859
public interface UserRepository
5960
extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User>, UserRepositoryCustom {
@@ -625,6 +626,17 @@ Page<User> findAllOrderedBySpecialNameMultipleParams(@Param("name") String name,
625626
// GH-2408
626627
List<NameOnly> findAllInterfaceProjectedBy();
627628

629+
// GH-2045, GH-425
630+
@Query("select concat(?1,u.id,?2) as idWithPrefixAndSuffix from #{#entityName} u")
631+
List<String> findAllAndSortByFunctionResultPositionalParameter(
632+
@Param("positionalParameter1") String positionalParameter1,
633+
@Param("positionalParameter2") String positionalParameter2, Sort sort);
634+
635+
// GH-2045, GH-425
636+
@Query("select concat(:namedParameter1,u.id,:namedParameter2) as idWithPrefixAndSuffix from #{#entityName} u")
637+
List<String> findAllAndSortByFunctionResultNamedParameter(@Param("namedParameter1") String namedParameter1,
638+
@Param("namedParameter2") String namedParameter2, Sort sort);
639+
628640
interface RolesAndFirstname {
629641

630642
String getFirstname();

0 commit comments

Comments
 (0)