Skip to content

Commit 4dd9369

Browse files
mp911degregturn
authored andcommitted
Delay count query derivation.
We now delay the count query creation to the actual time when we need the count query to avoid query creation of invalid queries (e.g. count queries for DELETE or UPDATE statements). See #2812
1 parent c001de8 commit 4dd9369

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

src/main/java/org/springframework/data/jpa/repository/query/AbstractStringBasedJpaQuery.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.springframework.data.repository.query.QueryMethodEvaluationContextProvider;
2222
import org.springframework.data.repository.query.ResultProcessor;
2323
import org.springframework.data.repository.query.ReturnedType;
24+
import org.springframework.data.util.Lazy;
2425
import org.springframework.expression.spel.standard.SpelExpressionParser;
2526
import org.springframework.lang.Nullable;
2627
import org.springframework.util.Assert;
@@ -39,7 +40,7 @@
3940
abstract class AbstractStringBasedJpaQuery extends AbstractJpaQuery {
4041

4142
private final DeclaredQuery query;
42-
private final DeclaredQuery countQuery;
43+
private final Lazy<DeclaredQuery> countQuery;
4344
private final QueryMethodEvaluationContextProvider evaluationContextProvider;
4445
private final SpelExpressionParser parser;
4546
private final QueryParameterSetter.QueryMetadataCache metadataCache = new QueryParameterSetter.QueryMetadataCache();
@@ -69,9 +70,10 @@ public AbstractStringBasedJpaQuery(JpaQueryMethod method, EntityManager em, Stri
6970
this.query = new ExpressionBasedStringQuery(queryString, method.getEntityInformation(), parser,
7071
method.isNativeQuery());
7172

72-
DeclaredQuery countQuery = query.deriveCountQuery(countQueryString, method.getCountQueryProjection());
73-
this.countQuery = ExpressionBasedStringQuery.from(countQuery, method.getEntityInformation(), parser,
74-
method.isNativeQuery());
73+
this.countQuery = Lazy.of(() -> {
74+
DeclaredQuery countQuery = query.deriveCountQuery(countQueryString, method.getCountQueryProjection());
75+
return ExpressionBasedStringQuery.from(countQuery, method.getEntityInformation(), parser, method.isNativeQuery());
76+
});
7577

7678
this.parser = parser;
7779

@@ -117,7 +119,7 @@ protected ParameterBinder createBinder() {
117119
@Override
118120
protected Query doCreateCountQuery(JpaParametersParameterAccessor accessor) {
119121

120-
String queryString = countQuery.getQueryString();
122+
String queryString = countQuery.get().getQueryString();
121123
EntityManager em = getEntityManager();
122124

123125
Query query = getQueryMethod().isNativeQuery() //
@@ -142,7 +144,7 @@ public DeclaredQuery getQuery() {
142144
* @return the countQuery
143145
*/
144146
public DeclaredQuery getCountQuery() {
145-
return countQuery;
147+
return countQuery.get();
146148
}
147149

148150
/**

0 commit comments

Comments
 (0)