Skip to content

Commit f8c4885

Browse files
committed
Drop FETCH from JOIN clauses when creating a count query in Hibernate.
Resolves #2348. Supercedes #2686.
1 parent 9f46bc7 commit f8c4885

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryTransformer.java

+23
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,29 @@ public List<JpaQueryParsingToken> visitFromRoot(HqlParser.FromRootContext ctx) {
265265
return tokens;
266266
}
267267

268+
@Override
269+
public List<JpaQueryParsingToken> visitJoin(HqlParser.JoinContext ctx) {
270+
271+
List<JpaQueryParsingToken> tokens = new ArrayList<>();
272+
273+
tokens.addAll(visit(ctx.joinType()));
274+
tokens.add(new JpaQueryParsingToken(ctx.JOIN()));
275+
276+
if (!countQuery) {
277+
if (ctx.FETCH() != null) {
278+
tokens.add(new JpaQueryParsingToken(ctx.FETCH()));
279+
}
280+
}
281+
282+
tokens.addAll(visit(ctx.joinTarget()));
283+
284+
if (ctx.joinRestriction() != null) {
285+
tokens.addAll(visit(ctx.joinRestriction()));
286+
}
287+
288+
return tokens;
289+
}
290+
268291
@Override
269292
public List<JpaQueryParsingToken> visitAlias(HqlParser.AliasContext ctx) {
270293

spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/HqlQueryTransformerTests.java

+10
Original file line numberDiff line numberDiff line change
@@ -793,6 +793,16 @@ void sortProperlyAppendsToExistingOrderByWithFunction() {
793793
"select e from SampleEntity e where function('nativeFunc', ?1) > 'testVal' order by function('nativeFunc', ?1), e.age desc");
794794
}
795795

796+
@Test // GH-2348
797+
void removeFetchFromJoinsDuringCountQueryCreation() {
798+
799+
assertCountQuery("select u from User u left outer join fetch u.roles r left outer JOIN FETCH u.accounts a",
800+
"select count(u) from User u left outer join u.roles r left outer JOIN u.accounts a");
801+
802+
assertCountQuery("SELECT DISTINCT b FROM Board b LEFT JOIN FETCH b.comments ORDER BY b.id",
803+
"SELECT count(DISTINCT b) FROM Board b LEFT JOIN b.comments");
804+
}
805+
796806
private void assertCountQuery(String originalQuery, String countQuery) {
797807
assertThat(createCountQueryFor(originalQuery)).isEqualTo(countQuery);
798808
}

0 commit comments

Comments
 (0)