Skip to content

Commit b2f891f

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

File tree

3 files changed

+28
-2
lines changed

3 files changed

+28
-2
lines changed

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

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

+14-1
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,10 @@
9494
* @author Andrey Kovalev
9595
* @author Sander Krabbenborg
9696
* @author Jesse Wouters
97-
* @author Greg Turnquist
97+
* @author Greg Turnquist <<<<<<< HEAD =======
98+
* @author Diego Krupitza
99+
* @author Daniel Shuy
100+
* @author Simon Paradies >>>>>>> 0cef764d (Fix order by clauses for functions with positional and named arguments.)
98101
*/
99102
@ExtendWith(SpringExtension.class)
100103
@ContextConfiguration("classpath:application-context.xml")
@@ -2656,6 +2659,16 @@ void readsDerivedInterfaceProjections() {
26562659
assertThat(repository.findAllInterfaceProjectedBy()).hasSize(4);
26572660
}
26582661

2662+
@Test // GH-2045, GH-425
2663+
public void correctlyBuildSortClauseWhenSortingByFunctionAliasAndFunctionContainsPositionalParameters() {
2664+
repository.findAllAndSortByFunctionResultPositionalParameter("prefix", "suffix", Sort.by("idWithPrefixAndSuffix"));
2665+
}
2666+
2667+
@Test // GH-2045, GH-425
2668+
public void correctlyBuildSortClauseWhenSortingByFunctionAliasAndFunctionContainsNamedParameters() {
2669+
repository.findAllAndSortByFunctionResultNamedParameter("prefix", "suffix", Sort.by("idWithPrefixAndSuffix"));
2670+
}
2671+
26592672
private Page<User> executeSpecWithSort(Sort sort) {
26602673

26612674
flushTestUsers();

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)