diff --git a/pom.xml b/pom.xml
index c77686453f..13e533e55e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-jpa-parent
- 3.1.0-SNAPSHOT
+ 3.1.0-gh-2884-SNAPSHOT
pom
Spring Data JPA Parent
diff --git a/spring-data-envers/pom.xml b/spring-data-envers/pom.xml
index db915d7c3b..13fed4dfe1 100755
--- a/spring-data-envers/pom.xml
+++ b/spring-data-envers/pom.xml
@@ -5,12 +5,12 @@
org.springframework.data
spring-data-envers
- 3.1.0-SNAPSHOT
+ 3.1.0-gh-2884-SNAPSHOT
org.springframework.data
spring-data-jpa-parent
- 3.1.0-SNAPSHOT
+ 3.1.0-gh-2884-SNAPSHOT
../pom.xml
diff --git a/spring-data-jpa-distribution/pom.xml b/spring-data-jpa-distribution/pom.xml
index a5cb2f09b5..67e15d3a81 100644
--- a/spring-data-jpa-distribution/pom.xml
+++ b/spring-data-jpa-distribution/pom.xml
@@ -14,7 +14,7 @@
org.springframework.data
spring-data-jpa-parent
- 3.1.0-SNAPSHOT
+ 3.1.0-gh-2884-SNAPSHOT
../pom.xml
diff --git a/spring-data-jpa/pom.xml b/spring-data-jpa/pom.xml
index 27313e9e3c..d2529cd6c7 100644
--- a/spring-data-jpa/pom.xml
+++ b/spring-data-jpa/pom.xml
@@ -6,7 +6,7 @@
org.springframework.data
spring-data-jpa
- 3.1.0-SNAPSHOT
+ 3.1.0-gh-2884-SNAPSHOT
Spring Data JPA
Spring Data module for JPA repositories.
@@ -15,7 +15,7 @@
org.springframework.data
spring-data-jpa-parent
- 3.1.0-SNAPSHOT
+ 3.1.0-gh-2884-SNAPSHOT
../pom.xml
diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java
index f581f191ff..0d2c65072b 100644
--- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java
+++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java
@@ -186,7 +186,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/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java
index 2ee00f42a2..99dada4923 100644
--- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java
+++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java
@@ -15,14 +15,8 @@
*/
package org.springframework.data.jpa.repository.query;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
-import static org.springframework.data.jpa.repository.query.QueryUtils.applySorting;
-import static org.springframework.data.jpa.repository.query.QueryUtils.createCountQueryFor;
-import static org.springframework.data.jpa.repository.query.QueryUtils.detectAlias;
-import static org.springframework.data.jpa.repository.query.QueryUtils.getOuterJoinAliases;
-import static org.springframework.data.jpa.repository.query.QueryUtils.hasConstructorExpression;
-import static org.springframework.data.jpa.repository.query.QueryUtils.removeSubqueries;
+import static org.assertj.core.api.Assertions.*;
+import static org.springframework.data.jpa.repository.query.QueryUtils.*;
import java.util.Collections;
import java.util.Set;
@@ -891,4 +885,30 @@ void orderByShouldWorkWithSubSelectStatements() {
+ ") as timestamp\n" //
+ "from foo f", sort)).endsWith("order by f.age desc");
}
+
+ @Test // GH-2884
+ void functionAliasShouldSupportArgumentsWithCommasOrArgumentsWithSemiColons() {
+
+ assertThat(QueryUtils.getFunctionAliases("""
+ select s.id as id, s.name as name, gp.points
+ from specialist s
+ left join (
+ select q.specialist_id, listagg(q.points, ',') as points
+ from qualification q
+ group by q.specialist_id
+ ) gp on gp.specialist_id = s.id
+ where name like :name
+ """)).containsExactly("points");
+
+ assertThat(QueryUtils.getFunctionAliases("""
+ select s.id as id, s.name as name, gp.points
+ from specialist s
+ left join (
+ select q.specialist_id, listagg(q.points, ';') as points
+ from qualification q
+ group by q.specialist_id
+ ) gp on gp.specialist_id = s.id
+ where name like :name
+ """)).containsExactly("points");
+ }
}