DATAJPA-1000 - Fixed alias detection for fetch joins.

We now ignore potentially defined fetch expressions in joins when detecting aliases inside joins.
This commit is contained in:
Oliver Gierke
2016-11-06 22:05:08 +01:00
parent 84fd3bcc39
commit 3bba394b7d
2 changed files with 14 additions and 2 deletions

View File

@@ -88,7 +88,7 @@ public abstract class QueryUtils {
private static final String IDENTIFIER = "[\\p{Lu}\\P{InBASIC_LATIN}\\p{Alnum}._$]+";
private static final String IDENTIFIER_GROUP = String.format("(%s)", IDENTIFIER);
private static final String JOIN = "join\\s" + IDENTIFIER + "\\s(as\\s)?" + IDENTIFIER_GROUP;
private static final String JOIN = "join\\s+(fetch\\s+)?" + IDENTIFIER + "\\s+(as\\s+)?" + IDENTIFIER_GROUP;
private static final Pattern JOIN_PATTERN = Pattern.compile(JOIN, Pattern.CASE_INSENSITIVE);
private static final String EQUALS_CONDITION_STRING = "%s.%s = :%s";
@@ -101,7 +101,7 @@ public abstract class QueryUtils {
private static final Map<PersistentAttributeType, Class<? extends Annotation>> ASSOCIATION_TYPES;
private static final int QUERY_JOIN_ALIAS_GROUP_INDEX = 2;
private static final int QUERY_JOIN_ALIAS_GROUP_INDEX = 3;
private static final int VARIABLE_NAME_GROUP_INDEX = 4;
private static final Pattern PUNCTATION_PATTERN = Pattern.compile(".*((?![\\._])[\\p{Punct}|\\s])");

View File

@@ -501,6 +501,18 @@ public class QueryUtilsUnitTests {
assertThat(applySorting(query, sort, "m"), endsWith("order by avgPrice asc"));
}
/**
* @see DATAJPA-1000
*/
@Test
public void discoversCorrectAliasForJoinFetch() {
Set<String> aliases = QueryUtils
.getOuterJoinAliases("SELECT DISTINCT user FROM User user LEFT JOIN FETCH user.authorities AS authority");
assertThat(aliases, contains("authority"));
}
private static void assertCountQuery(String originalQuery, String countQuery) {
assertThat(createCountQueryFor(originalQuery), is(countQuery));
}