Skip to content

Commit 9d4bde3

Browse files
mp911dechristophstrobl
authored andcommitted
Suppress selection item aliasing for the actual count query.
We now no longer apply count selection filtering but rather skip select field aliasing when rendering a count query to drop the field alias within a count query. Previously, we removed field aliasing by filtering the token stream which also removed the AS keyword from cast operators. Closes: #3536 Original Pull Request: #3553
1 parent e3da2f7 commit 9d4bde3

File tree

2 files changed

+35
-7
lines changed

2 files changed

+35
-7
lines changed

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

+18-7
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,7 @@
1515
*/
1616
package org.springframework.data.jpa.repository.query;
1717

18-
import static org.springframework.data.jpa.repository.query.QueryTokens.TOKEN_AS;
19-
import static org.springframework.data.jpa.repository.query.QueryTokens.TOKEN_CLOSE_PAREN;
20-
import static org.springframework.data.jpa.repository.query.QueryTokens.TOKEN_COUNT_FUNC;
21-
import static org.springframework.data.jpa.repository.query.QueryTokens.TOKEN_DOUBLE_UNDERSCORE;
22-
import static org.springframework.data.jpa.repository.query.QueryTokens.TOKEN_OPEN_PAREN;
23-
import static org.springframework.data.jpa.repository.query.QueryTokens.TOKEN_SELECT_COUNT;
18+
import static org.springframework.data.jpa.repository.query.QueryTokens.*;
2419

2520
import org.springframework.data.jpa.repository.query.HqlParser.SelectClauseContext;
2621
import org.springframework.data.jpa.repository.query.QueryRenderer.QueryRendererBuilder;
@@ -208,6 +203,22 @@ public QueryTokenStream visitSelectClause(HqlParser.SelectClauseContext ctx) {
208203
return builder;
209204
}
210205

206+
@Override
207+
public QueryTokenStream visitSelection(HqlParser.SelectionContext ctx) {
208+
209+
if (isSubquery(ctx)) {
210+
return super.visitSelection(ctx);
211+
}
212+
213+
QueryRendererBuilder builder = QueryRenderer.builder();
214+
215+
builder.append(visit(ctx.selectExpression()));
216+
217+
// do not append variables to skip AS field aliasing
218+
219+
return builder;
220+
}
221+
211222
@Override
212223
public QueryRendererBuilder visitQueryOrder(HqlParser.QueryOrderContext ctx) {
213224

@@ -247,7 +258,7 @@ private QueryRendererBuilder getDistinctCountSelection(QueryTokenStream selectio
247258
nested.append(QueryTokens.token(primaryFromAlias));
248259
} else {
249260
// keep all the select items to distinct against
250-
nested.append(countSelection);
261+
nested.append(selectionListbuilder);
251262
}
252263
return nested;
253264
}

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

+17
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,23 @@ void applyCountToSimpleQuery() {
9090
assertThat(results).isEqualTo("select count(e) FROM Employee e where e.name = :name");
9191
}
9292

93+
@Test // GH-3536
94+
void shouldCreateCountQueryForDistinctCount() {
95+
96+
// given
97+
var original = """
98+
select distinct cast(e.timestampField as date) as foo
99+
from ExampleEntity e
100+
order by cast(e.timestampField as date) desc
101+
""";
102+
103+
// when
104+
var results = createCountQueryFor(original);
105+
106+
// then
107+
assertThat(results).isEqualTo("select count(distinct cast(e.timestampField as date)) from ExampleEntity e");
108+
}
109+
93110
@Test
94111
void applyCountToMoreComplexQuery() {
95112

0 commit comments

Comments
 (0)