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 cdd49c6241..f3807f9a4e 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 @@ -87,6 +87,7 @@ public abstract class QueryUtils { private static final String SIMPLE_COUNT_VALUE = "$2"; private static final String COMPLEX_COUNT_VALUE = "$3 $6"; private static final String COMPLEX_COUNT_LAST_VALUE = "$6"; + private static final String FETCH_COMING_AFTER_JOIN_PART = "(?iu)(?<=join)(\\s*fetch\\s*)"; private static final String ORDER_BY_PART = "(?iu)\\s+order\\s+by\\s+.*"; private static final Pattern ALIAS_MATCH; @@ -601,6 +602,8 @@ public static String createCountQueryFor(String originalQuery, @Nullable String countQuery = matcher.replaceFirst(String.format(COUNT_REPLACEMENT_TEMPLATE, countProjection)); } + countQuery = countQuery.replaceAll(FETCH_COMING_AFTER_JOIN_PART, " "); + return countQuery.replaceFirst(ORDER_BY_PART, ""); } diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/DefaultQueryUtilsUnitTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/DefaultQueryUtilsUnitTests.java index 828f8a835b..3de3a010f7 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/DefaultQueryUtilsUnitTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/DefaultQueryUtilsUnitTests.java @@ -40,6 +40,7 @@ * @author Grégoire Druant * @author Mohammad Hewedy * @author Greg Turnquist + * @author Vladislav Yukharin */ class DefaultQueryUtilsUnitTests { @@ -224,6 +225,13 @@ void doesNotPrefixSortsIfFunction() { .isThrownBy(() -> applySorting("select p from Person p", sort, "p")); } + @Test // GH-2348 + void removesFetchPartInJoinFetchClauseInGeneratedCountQueryIfPresent() { + + assertCountQuery("select u from User u left outer join fetch u.roles r left outer JOIN FETCH u.accounts a", + "select count(u) from User u left outer join u.roles r left outer JOIN u.accounts a"); + } + @Test // DATAJPA-377 void removesOrderByInGeneratedCountQueryFromOriginalQueryIfPresent() {