From 8659feae1f0d74bb9dff7d0d9b2b6abd28333f55 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 19 Jun 2018 00:42:08 +0200 Subject: [PATCH] DATAJPA-1363 - QueryUtils now detects aliases for functions using complex expressions. --- .../data/jpa/repository/query/QueryUtils.java | 12 +++++++----- .../jpa/repository/query/QueryUtilsUnitTests.java | 8 ++++++++ 2 files changed, 15 insertions(+), 5 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 4bf26d89c..af3905e43 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 @@ -158,9 +158,10 @@ public abstract class QueryUtils { CONSTRUCTOR_EXPRESSION = compile(builder.toString(), CASE_INSENSITIVE + DOTALL); builder = new StringBuilder(); - builder.append("\\s+"); // at least one space - builder.append("\\w+\\([0-9a-zA-z\\._,\\s']+\\)"); // any function call including parameters within the brackets - builder.append("\\s+[as|AS]+\\s+(([\\w\\.]+))"); // the potential alias + // any function call including parameters within the brackets + builder.append("\\w+\\s*\\([\\w\\.,\\s'=]+\\)"); + // the potential alias + builder.append("\\s+[as|AS]+\\s+(([\\w\\.]+))"); FUNCTION_PATTERN = compile(builder.toString()); } @@ -321,7 +322,7 @@ public abstract class QueryUtils { * @param query * @return */ - private static Set getFunctionAliases(String query) { + static Set getFunctionAliases(String query) { Set result = new HashSet(); Matcher matcher = FUNCTION_PATTERN.matcher(query); @@ -572,7 +573,8 @@ public abstract class QueryUtils { propertyPathModel = from.get(segment).getModel(); } - if (requiresJoin(propertyPathModel, model instanceof PluralAttribute, !property.hasNext()) && !isAlreadyFetched(from, segment)) { + if (requiresJoin(propertyPathModel, model instanceof PluralAttribute, !property.hasNext()) + && !isAlreadyFetched(from, segment)) { Join join = getOrCreateJoin(from, segment); return (Expression) (property.hasNext() ? toExpressionRecursively(join, property.next()) : join); } else { diff --git a/src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java b/src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java index c769b84d4..b6a99cfa3 100644 --- a/src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java @@ -393,6 +393,14 @@ public class QueryUtilsUnitTests { endsWith("WHERE x.id = :id")); } + @Test // DATAJPA-1363 + public void discoversAliasWithComplexFunction() { + + assertThat( + QueryUtils.getFunctionAliases("select new MyDto(sum(case when myEntity.prop3=0 then 1 else 0 end) as myAlias"), + contains("myAlias")); + } + private static void assertCountQuery(String originalQuery, String countQuery) { assertThat(createCountQueryFor(originalQuery), is(countQuery)); }