Drop FETCH from JOIN clauses when creating a count query in Hibernate.

Resolves #2348.
Supercedes #2686.
This commit is contained in:
Greg L. Turnquist
2023-03-22 10:24:54 -05:00
committed by Jens Schauder
parent 8121a5429d
commit e300bd89dd
2 changed files with 33 additions and 0 deletions

View File

@@ -276,6 +276,29 @@ class HqlQueryTransformer extends HqlQueryRenderer {
return tokens;
}
@Override
public List<JpaQueryParsingToken> visitJoin(HqlParser.JoinContext ctx) {
List<JpaQueryParsingToken> tokens = new ArrayList<>();
tokens.addAll(visit(ctx.joinType()));
tokens.add(new JpaQueryParsingToken(ctx.JOIN()));
if (!countQuery) {
if (ctx.FETCH() != null) {
tokens.add(new JpaQueryParsingToken(ctx.FETCH()));
}
}
tokens.addAll(visit(ctx.joinTarget()));
if (ctx.joinRestriction() != null) {
tokens.addAll(visit(ctx.joinRestriction()));
}
return tokens;
}
@Override
public List<JpaQueryParsingToken> visitAlias(HqlParser.AliasContext ctx) {

View File

@@ -903,6 +903,16 @@ class HqlQueryTransformerTests {
}
@Test // GH-2348
void removeFetchFromJoinsDuringCountQueryCreation() {
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");
assertCountQuery("SELECT DISTINCT b FROM Board b LEFT JOIN FETCH b.comments ORDER BY b.id",
"SELECT count(DISTINCT b) FROM Board b LEFT JOIN b.comments");
}
private void assertCountQuery(String originalQuery, String countQuery) {
assertThat(createCountQueryFor(originalQuery)).isEqualTo(countQuery);
}