From baae6c7149ce64d64a90d15905f48bc1b29aa1ea Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Fri, 22 May 2015 14:18:43 +0200 Subject: [PATCH] DATAJPA-726 - Fixed alias detection for queries containing joins. We now not only detect alias in left (outer) joins but basically all of them to find out whether or not to prefix sort expressions with the root alias. --- .../data/jpa/repository/query/QueryUtils.java | 10 +++++----- .../repository/query/QueryUtilsUnitTests.java | 20 ++++++++++++++++--- 2 files changed, 22 insertions(+), 8 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 a4d2371de..c1c7f6423 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 @@ -1,5 +1,5 @@ /* - * Copyright 2008-2014 the original author or authors. + * Copyright 2008-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -83,15 +83,15 @@ public abstract class QueryUtils { private static final String IDENTIFIER = "[\\p{Alnum}._$]+"; private static final String IDENTIFIER_GROUP = String.format("(%s)", IDENTIFIER); - private static final String LEFT_JOIN = "left (outer )?join " + IDENTIFIER + " (as )?" + IDENTIFIER_GROUP; - private static final Pattern LEFT_JOIN_PATTERN = Pattern.compile(LEFT_JOIN, Pattern.CASE_INSENSITIVE); + private static final String JOIN = "join " + IDENTIFIER + " (as )?" + IDENTIFIER_GROUP; + private static final Pattern JOIN_PATTERN = Pattern.compile(JOIN, Pattern.CASE_INSENSITIVE); private static final String EQUALS_CONDITION_STRING = "%s.%s = :%s"; private static final Pattern ORDER_BY = Pattern.compile(".*order\\s+by\\s+.*", CASE_INSENSITIVE); private static final Map> ASSOCIATION_TYPES; - private static final int QUERY_JOIN_ALIAS_GROUP_INDEX = 3; + private static final int QUERY_JOIN_ALIAS_GROUP_INDEX = 2; private static final int VARIABLE_NAME_GROUP_INDEX = 4; static { @@ -252,7 +252,7 @@ public abstract class QueryUtils { static Set getOuterJoinAliases(String query) { Set result = new HashSet(); - Matcher matcher = LEFT_JOIN_PATTERN.matcher(query); + Matcher matcher = JOIN_PATTERN.matcher(query); while (matcher.find()) { 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 03a96e23f..fbcc24158 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 @@ -1,5 +1,5 @@ /* - * Copyright 2008-2014 the original author or authors. + * Copyright 2008-2015 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -150,11 +150,13 @@ public class QueryUtilsUnitTests { assertThat(aliases, hasSize(1)); assertThat(aliases, hasItems("b2_$ar")); - aliases = getOuterJoinAliases("select p from Person p left outer join x.foo as b2_$ar, left join x.bar as foo where …"); + aliases = getOuterJoinAliases( + "select p from Person p left outer join x.foo as b2_$ar, left join x.bar as foo where …"); assertThat(aliases, hasSize(2)); assertThat(aliases, hasItems("b2_$ar", "foo")); - aliases = getOuterJoinAliases("select p from Person p left join x.foo as b2_$ar, left outer join x.bar foo where …"); + aliases = getOuterJoinAliases( + "select p from Person p left join x.foo as b2_$ar, left outer join x.bar foo where …"); assertThat(aliases, hasSize(2)); assertThat(aliases, hasItems("b2_$ar", "foo")); } @@ -281,6 +283,18 @@ public class QueryUtilsUnitTests { is("select count(p.lastname) from Person p")); } + /** + * @see DATAJPA-726 + */ + @Test + public void detectsAliassesInPlainJoins() { + + String query = "select p from Customer c join c.productOrder p where p.delayed = true"; + Sort sort = new Sort("p.lineItems"); + + assertThat(applySorting(query, sort, "c"), endsWith("order by p.lineItems asc")); + } + private void assertCountQuery(String originalQuery, String countQuery) { assertThat(createCountQueryFor(originalQuery), is(countQuery)); }