Skip to content

Commit f2d1a35

Browse files
committed
Polishing.
Introduce QueryInformation to provide query introspection results. Refine generics. See #3726 Original pull request: #3730
1 parent 643a3a9 commit f2d1a35

16 files changed

+239
-159
lines changed

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,9 @@ class EqlCountQueryTransformer extends EqlQueryRenderer {
3636
private final @Nullable String countProjection;
3737
private final @Nullable String primaryFromAlias;
3838

39-
EqlCountQueryTransformer(@Nullable String countProjection, @Nullable String primaryFromAlias) {
40-
39+
EqlCountQueryTransformer(@Nullable String countProjection, QueryInformation queryInformation) {
4140
this.countProjection = countProjection;
42-
this.primaryFromAlias = primaryFromAlias;
41+
this.primaryFromAlias = queryInformation.getAlias();
4342
}
4443

4544
@Override

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

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
package org.springframework.data.jpa.repository.query;
1717

18-
import static org.springframework.data.jpa.repository.query.QueryTokens.TOKEN_COMMA;
18+
import static org.springframework.data.jpa.repository.query.QueryTokens.*;
1919

2020
import java.util.ArrayList;
2121
import java.util.Collections;
@@ -31,7 +31,7 @@
3131
* @author Christoph Strobl
3232
*/
3333
@SuppressWarnings("UnreachableCode")
34-
class EqlQueryIntrospector extends EqlBaseVisitor<Void> implements ParsedQueryIntrospector {
34+
class EqlQueryIntrospector extends EqlBaseVisitor<Void> implements ParsedQueryIntrospector<QueryInformation> {
3535

3636
private final EqlQueryRenderer renderer = new EqlQueryRenderer();
3737

@@ -41,18 +41,9 @@ class EqlQueryIntrospector extends EqlBaseVisitor<Void> implements ParsedQueryIn
4141
private boolean hasConstructorExpression = false;
4242

4343
@Override
44-
public String getAlias() {
45-
return primaryFromAlias;
46-
}
47-
48-
@Override
49-
public List<QueryToken> getProjection() {
50-
return projection == null ? Collections.emptyList() : projection;
51-
}
52-
53-
@Override
54-
public boolean hasConstructorExpression() {
55-
return hasConstructorExpression;
44+
public QueryInformation getParsedQueryInformation() {
45+
return new QueryInformation(primaryFromAlias, projection == null ? Collections.emptyList() : projection,
46+
hasConstructorExpression);
5647
}
5748

5849
@Override

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,13 @@ class EqlSortedQueryTransformer extends EqlQueryRenderer {
4343
private final @Nullable String primaryFromAlias;
4444
private final @Nullable DtoProjectionTransformerDelegate dtoDelegate;
4545

46-
EqlSortedQueryTransformer(Sort sort, @Nullable String primaryFromAlias, @Nullable ReturnedType returnedType) {
46+
EqlSortedQueryTransformer(Sort sort, QueryInformation queryInformation, @Nullable ReturnedType returnedType) {
4747

4848
Assert.notNull(sort, "Sort must not be null");
49+
Assert.notNull(queryInformation, "ParsedHqlQueryInformation must not be null");
4950

5051
this.sort = sort;
51-
this.primaryFromAlias = primaryFromAlias;
52+
this.primaryFromAlias = queryInformation.getAlias();
5253
this.dtoDelegate = returnedType == null ? null : new DtoProjectionTransformerDelegate(returnedType);
5354
}
5455

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright 2025 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.springframework.data.jpa.repository.query;
17+
18+
import java.util.List;
19+
20+
import org.springframework.lang.Nullable;
21+
22+
/**
23+
* Hibernate-specific query details capturing common table expression details.
24+
*
25+
* @author Mark Paluch
26+
* @since 3.5
27+
*/
28+
class HibernateQueryInformation extends QueryInformation {
29+
30+
private final boolean hasCte;
31+
32+
public HibernateQueryInformation(@Nullable String alias, List<QueryToken> projection,
33+
boolean hasConstructorExpression, boolean hasCte) {
34+
super(alias, projection, hasConstructorExpression);
35+
this.hasCte = hasCte;
36+
}
37+
38+
public boolean hasCte() {
39+
return hasCte;
40+
}
41+
}

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

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,12 @@ class HqlCountQueryTransformer extends HqlQueryRenderer {
3636

3737
private final @Nullable String countProjection;
3838
private final @Nullable String primaryFromAlias;
39-
private boolean containsCTE = false;
39+
private final boolean containsCTE;
4040

41-
HqlCountQueryTransformer(@Nullable String countProjection, @Nullable String primaryFromAlias) {
41+
HqlCountQueryTransformer(@Nullable String countProjection, HibernateQueryInformation queryInformation) {
4242
this.countProjection = countProjection;
43-
this.primaryFromAlias = primaryFromAlias;
43+
this.primaryFromAlias = queryInformation.getAlias();
44+
this.containsCTE = queryInformation.hasCte();
4445
}
4546

4647
@Override
@@ -67,12 +68,6 @@ public QueryRendererBuilder visitOrderedQuery(HqlParser.OrderedQueryContext ctx)
6768
return builder;
6869
}
6970

70-
@Override
71-
public QueryTokenStream visitCte(HqlParser.CteContext ctx) {
72-
this.containsCTE = true;
73-
return super.visitCte(ctx);
74-
}
75-
7671
@Override
7772
public QueryRendererBuilder visitFromQuery(HqlParser.FromQueryContext ctx) {
7873

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

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,28 +30,20 @@
3030
* @author Mark Paluch
3131
*/
3232
@SuppressWarnings({ "UnreachableCode", "ConstantValue" })
33-
class HqlQueryIntrospector extends HqlBaseVisitor<Void> implements ParsedQueryIntrospector {
33+
class HqlQueryIntrospector extends HqlBaseVisitor<Void> implements ParsedQueryIntrospector<HibernateQueryInformation> {
3434

3535
private final HqlQueryRenderer renderer = new HqlQueryRenderer();
3636

3737
private @Nullable String primaryFromAlias = null;
3838
private @Nullable List<QueryToken> projection;
3939
private boolean projectionProcessed;
4040
private boolean hasConstructorExpression = false;
41+
private boolean hasCte = false;
4142

4243
@Override
43-
public String getAlias() {
44-
return primaryFromAlias;
45-
}
46-
47-
@Override
48-
public List<QueryToken> getProjection() {
49-
return projection == null ? Collections.emptyList() : projection;
50-
}
51-
52-
@Override
53-
public boolean hasConstructorExpression() {
54-
return hasConstructorExpression;
44+
public HibernateQueryInformation getParsedQueryInformation() {
45+
return new HibernateQueryInformation(primaryFromAlias, projection == null ? Collections.emptyList() : projection,
46+
hasConstructorExpression, hasCte);
5547
}
5648

5749
@Override
@@ -65,6 +57,12 @@ public Void visitSelectClause(HqlParser.SelectClauseContext ctx) {
6557
return super.visitSelectClause(ctx);
6658
}
6759

60+
@Override
61+
public Void visitCte(HqlParser.CteContext ctx) {
62+
this.hasCte = true;
63+
return super.visitCte(ctx);
64+
}
65+
6866
@Override
6967
public Void visitFromRoot(HqlParser.FromRootContext ctx) {
7068

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

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,21 +41,14 @@ class HqlSortedQueryTransformer extends HqlQueryRenderer {
4141
private final @Nullable String primaryFromAlias;
4242
private final @Nullable DtoProjectionTransformerDelegate dtoDelegate;
4343

44-
HqlSortedQueryTransformer(Sort sort, @Nullable String primaryFromAlias) {
44+
HqlSortedQueryTransformer(Sort sort, HibernateQueryInformation queryInformation,
45+
@Nullable ReturnedType returnedType) {
4546

4647
Assert.notNull(sort, "Sort must not be null");
48+
Assert.notNull(queryInformation, "ParsedHqlQueryInformation must not be null");
4749

4850
this.sort = sort;
49-
this.primaryFromAlias = primaryFromAlias;
50-
this.dtoDelegate = null;
51-
}
52-
53-
HqlSortedQueryTransformer(Sort sort, @Nullable String primaryFromAlias, @Nullable ReturnedType returnedType) {
54-
55-
Assert.notNull(sort, "Sort must not be null");
56-
57-
this.sort = sort;
58-
this.primaryFromAlias = primaryFromAlias;
51+
this.primaryFromAlias = queryInformation.getAlias();
5952
this.dtoDelegate = returnedType == null ? null : new DtoProjectionTransformerDelegate(returnedType);
6053
}
6154

0 commit comments

Comments
 (0)