Skip to content

Commit 0907c1c

Browse files
gregturnklajdipaja
authored andcommitted
Count query generation should handle missing alias.
In the event of a Hibernate query where the FROM clause has no alias, the query parser should use "__" as a stand-in alias. Resolves spring-projects#2032. Related: spring-projects#2220.
1 parent 5c6bace commit 0907c1c

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed

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

+11
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,17 @@ public List<JpaQueryParsingToken> visitFromRoot(HqlParser.FromRootContext ctx) {
243243
if (this.alias == null && !isSubquery(ctx)) {
244244
this.alias = tokens.get(tokens.size() - 1).getToken();
245245
}
246+
} else {
247+
248+
if (countQuery) {
249+
250+
tokens.add(TOKEN_AS);
251+
tokens.add(TOKEN_DOUBLE_UNDERSCORE);
252+
253+
if (this.alias == null && !isSubquery(ctx)) {
254+
this.alias = TOKEN_DOUBLE_UNDERSCORE.getToken();
255+
}
256+
}
246257
}
247258
} else if (ctx.subquery() != null) {
248259

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

+4-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import java.util.List;
1919
import java.util.function.Supplier;
20-
import java.util.stream.Collectors;
2120

2221
import org.antlr.v4.runtime.Token;
2322
import org.antlr.v4.runtime.tree.TerminalNode;
@@ -53,6 +52,10 @@ class JpaQueryParsingToken {
5352
public static final JpaQueryParsingToken TOKEN_CLOSE_SQUARE_BRACKET_BRACE = new JpaQueryParsingToken("]}");
5453
public static final JpaQueryParsingToken TOKEN_CLOSE_PAREN_BRACE = new JpaQueryParsingToken(")}");
5554

55+
public static final JpaQueryParsingToken TOKEN_DOUBLE_UNDERSCORE = new JpaQueryParsingToken("__");
56+
57+
public static final JpaQueryParsingToken TOKEN_AS = new JpaQueryParsingToken("AS");
58+
5659
public static final JpaQueryParsingToken TOKEN_DESC = new JpaQueryParsingToken("desc", false);
5760

5861
public static final JpaQueryParsingToken TOKEN_ASC = new JpaQueryParsingToken("asc", false);

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

+10
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,16 @@ void queryParserPicksCorrectAliasAmidstMultipleAlises() {
798798
assertThat(alias("select u from User as u left join u.roles as r")).isEqualTo("u");
799799
}
800800

801+
@Test // GH-2032
802+
void countQueryShouldWorkEvenWithoutExplicitAlias() {
803+
804+
assertCountQuery("FROM BookError WHERE portal = :portal",
805+
"select count(__) FROM BookError AS __ WHERE portal = :portal");
806+
807+
assertCountQuery("FROM BookError b WHERE portal = :portal",
808+
"select count(b) FROM BookError b WHERE portal = :portal");
809+
}
810+
801811
private void assertCountQuery(String originalQuery, String countQuery) {
802812
assertThat(createCountQueryFor(originalQuery)).isEqualTo(countQuery);
803813
}

0 commit comments

Comments
 (0)