From e20eae2eb56a31e9857533ed3722ee5ecbb89f92 Mon Sep 17 00:00:00 2001 From: Vladislav Yukharin Date: Sun, 2 Oct 2022 23:04:52 +0600 Subject: [PATCH] Remove 'fetch' part in 'join fetch' clause during generation of count query --- .../data/jpa/repository/query/QueryUtils.java | 3 +++ .../jpa/repository/query/DefaultQueryUtilsUnitTests.java | 8 ++++++++ 2 files changed, 11 insertions(+) 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() {