Skip to content

Commit 3bba394

Browse files
committed
DATAJPA-1000 - Fixed alias detection for fetch joins.
We now ignore potentially defined fetch expressions in joins when detecting aliases inside joins.
1 parent 84fd3bc commit 3bba394

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ public abstract class QueryUtils {
8888
private static final String IDENTIFIER = "[\\p{Lu}\\P{InBASIC_LATIN}\\p{Alnum}._$]+";
8989
private static final String IDENTIFIER_GROUP = String.format("(%s)", IDENTIFIER);
9090

91-
private static final String JOIN = "join\\s" + IDENTIFIER + "\\s(as\\s)?" + IDENTIFIER_GROUP;
91+
private static final String JOIN = "join\\s+(fetch\\s+)?" + IDENTIFIER + "\\s+(as\\s+)?" + IDENTIFIER_GROUP;
9292
private static final Pattern JOIN_PATTERN = Pattern.compile(JOIN, Pattern.CASE_INSENSITIVE);
9393

9494
private static final String EQUALS_CONDITION_STRING = "%s.%s = :%s";
@@ -101,7 +101,7 @@ public abstract class QueryUtils {
101101

102102
private static final Map<PersistentAttributeType, Class<? extends Annotation>> ASSOCIATION_TYPES;
103103

104-
private static final int QUERY_JOIN_ALIAS_GROUP_INDEX = 2;
104+
private static final int QUERY_JOIN_ALIAS_GROUP_INDEX = 3;
105105
private static final int VARIABLE_NAME_GROUP_INDEX = 4;
106106

107107
private static final Pattern PUNCTATION_PATTERN = Pattern.compile(".*((?![\\._])[\\p{Punct}|\\s])");

src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -501,6 +501,18 @@ public void doesNotPrefixAliasedFunctionCallNameWhenQueryStringContainsMultipleW
501501
assertThat(applySorting(query, sort, "m"), endsWith("order by avgPrice asc"));
502502
}
503503

504+
/**
505+
* @see DATAJPA-1000
506+
*/
507+
@Test
508+
public void discoversCorrectAliasForJoinFetch() {
509+
510+
Set<String> aliases = QueryUtils
511+
.getOuterJoinAliases("SELECT DISTINCT user FROM User user LEFT JOIN FETCH user.authorities AS authority");
512+
513+
assertThat(aliases, contains("authority"));
514+
}
515+
504516
private static void assertCountQuery(String originalQuery, String countQuery) {
505517
assertThat(createCountQueryFor(originalQuery), is(countQuery));
506518
}

0 commit comments

Comments
 (0)