@@ -112,28 +112,28 @@ private NamedQueries getNamedQueries(@Nullable RepositoryConfigurationSource con
112
112
* Creates the {@link AotQueries} used within a specific {@link JpaQueryMethod}.
113
113
*
114
114
* @param repositoryInformation
115
- * @param query
115
+ * @param returnedType
116
116
* @param selector
117
+ * @param query
117
118
* @param queryMethod
118
- * @param returnedType
119
119
* @return
120
120
*/
121
- public AotQueries createQueries (RepositoryInformation repositoryInformation , MergedAnnotation < Query > query ,
122
- QueryEnhancerSelector selector , JpaQueryMethod queryMethod , ReturnedType returnedType ) {
121
+ public AotQueries createQueries (RepositoryInformation repositoryInformation , ReturnedType returnedType ,
122
+ QueryEnhancerSelector selector , MergedAnnotation < Query > query , JpaQueryMethod queryMethod ) {
123
123
124
124
if (query .isPresent () && StringUtils .hasText (query .getString ("value" ))) {
125
125
return buildStringQuery (repositoryInformation .getDomainType (), returnedType , selector , query , queryMethod );
126
126
}
127
127
128
128
String queryName = queryMethod .getNamedQueryName ();
129
- if (hasNamedQuery (queryName , returnedType )) {
129
+ if (hasNamedQuery (returnedType , queryName )) {
130
130
return buildNamedQuery (returnedType , selector , queryName , query , queryMethod );
131
131
}
132
132
133
- return buildPartTreeQuery (returnedType , repositoryInformation , query , queryMethod );
133
+ return buildPartTreeQuery (repositoryInformation , returnedType , selector , query , queryMethod );
134
134
}
135
135
136
- private boolean hasNamedQuery (String queryName , ReturnedType returnedType ) {
136
+ private boolean hasNamedQuery (ReturnedType returnedType , String queryName ) {
137
137
return namedQueries .hasQuery (queryName ) || getNamedQuery (returnedType , queryName ) != null ;
138
138
}
139
139
@@ -142,19 +142,15 @@ private AotQueries buildStringQuery(Class<?> domainType, ReturnedType returnedTy
142
142
143
143
UnaryOperator <String > operator = s -> s .replaceAll ("#\\ {#entityName}" , domainType .getName ());
144
144
boolean isNative = query .getBoolean ("nativeQuery" );
145
- Function <String , StringAotQuery > queryFunction = isNative ? StringAotQuery ::nativeQuery : StringAotQuery ::jpqlQuery ;
145
+ Function <String , DeclaredQuery > queryFunction = isNative ? DeclaredQuery ::nativeQuery : DeclaredQuery ::jpqlQuery ;
146
146
queryFunction = operator .andThen (queryFunction );
147
147
148
148
String queryString = query .getString ("value" );
149
149
150
- StringAotQuery aotStringQuery = queryFunction .apply (queryString );
150
+ EntityQuery entityQuery = EntityQuery .create (queryFunction .apply (queryString ), selector );
151
+ StringAotQuery aotStringQuery = StringAotQuery .of (entityQuery );
151
152
String countQuery = query .getString ("countQuery" );
152
153
153
- EntityQuery entityQuery = EntityQuery .create (aotStringQuery .getQuery (), selector );
154
- if (entityQuery .hasConstructorExpression () || entityQuery .isDefaultProjection ()) {
155
- aotStringQuery = aotStringQuery .withConstructorExpressionOrDefaultProjection ();
156
- }
157
-
158
154
if (returnedType .isProjecting () && returnedType .hasInputProperties ()
159
155
&& !returnedType .getReturnedType ().isInterface ()) {
160
156
@@ -174,38 +170,38 @@ public ReturnedType getReturnedType() {
174
170
}
175
171
176
172
if (StringUtils .hasText (countQuery )) {
177
- return AotQueries .from (aotStringQuery , queryFunction .apply (countQuery ));
173
+ return AotQueries .from (aotStringQuery , StringAotQuery . of ( queryFunction .apply (countQuery ) ));
178
174
}
179
175
180
- if (hasNamedQuery (queryMethod .getNamedCountQueryName (), returnedType )) {
176
+ if (hasNamedQuery (returnedType , queryMethod .getNamedCountQueryName ())) {
181
177
return AotQueries .from (aotStringQuery ,
182
- createNamedAotQuery (returnedType , queryMethod .getNamedCountQueryName (), queryMethod , isNative ));
178
+ createNamedAotQuery (returnedType , selector , queryMethod .getNamedCountQueryName (), queryMethod , isNative ));
183
179
}
184
180
185
181
String countProjection = query .getString ("countProjection" );
186
- return AotQueries .from (aotStringQuery , countProjection , selector );
182
+ return AotQueries .withDerivedCountQuery (aotStringQuery , StringAotQuery :: getQuery , countProjection , selector );
187
183
}
188
184
189
- private AotQueries buildNamedQuery (ReturnedType returnedType , QueryEnhancerSelector selector ,
190
- String queryName , MergedAnnotation <Query > query , JpaQueryMethod queryMethod ) {
185
+ private AotQueries buildNamedQuery (ReturnedType returnedType , QueryEnhancerSelector selector , String queryName ,
186
+ MergedAnnotation <Query > query , JpaQueryMethod queryMethod ) {
191
187
192
188
boolean nativeQuery = query .isPresent () && query .getBoolean ("nativeQuery" );
193
- AotQuery aotQuery = createNamedAotQuery (returnedType , queryName , queryMethod , nativeQuery );
194
-
189
+ AotQuery aotQuery = createNamedAotQuery (returnedType , selector , queryName , queryMethod , nativeQuery );
195
190
String countQuery = query .isPresent () ? query .getString ("countQuery" ) : null ;
196
191
197
192
if (StringUtils .hasText (countQuery )) {
198
193
return AotQueries .from (aotQuery ,
199
- aotQuery .isNative () ? StringAotQuery .nativeQuery (countQuery ) : StringAotQuery .jpqlQuery (countQuery ));
194
+ StringAotQuery
195
+ .of (aotQuery .isNative () ? DeclaredQuery .nativeQuery (countQuery ) : DeclaredQuery .jpqlQuery (countQuery )));
200
196
}
201
197
202
- if (hasNamedQuery (queryMethod .getNamedCountQueryName (), returnedType )) {
198
+ if (hasNamedQuery (returnedType , queryMethod .getNamedCountQueryName ())) {
203
199
return AotQueries .from (aotQuery ,
204
- createNamedAotQuery (returnedType , queryMethod .getNamedCountQueryName (), queryMethod , nativeQuery ));
200
+ createNamedAotQuery (returnedType , selector , queryMethod .getNamedCountQueryName (), queryMethod , nativeQuery ));
205
201
}
206
202
207
203
String countProjection = query .isPresent () ? query .getString ("countProjection" ) : null ;
208
- return AotQueries .from (aotQuery , it -> {
204
+ return AotQueries .withDerivedCountQuery (aotQuery , it -> {
209
205
210
206
if (it instanceof StringAotQuery sq ) {
211
207
return sq .getQuery ();
@@ -215,25 +211,26 @@ private AotQueries buildNamedQuery(ReturnedType returnedType, QueryEnhancerSelec
215
211
}, countProjection , selector );
216
212
}
217
213
218
- private AotQuery createNamedAotQuery (ReturnedType returnedType , String queryName , JpaQueryMethod queryMethod ,
219
- boolean isNative ) {
214
+ private AotQuery createNamedAotQuery (ReturnedType returnedType , QueryEnhancerSelector selector , String queryName ,
215
+ JpaQueryMethod queryMethod , boolean isNative ) {
220
216
221
217
if (namedQueries .hasQuery (queryName )) {
222
218
223
219
String queryString = namedQueries .getQuery (queryName );
224
- return StringAotQuery .named (queryName ,
225
- isNative ? DeclaredQuery .nativeQuery (queryString ) : DeclaredQuery .jpqlQuery (queryString ));
220
+
221
+ DeclaredQuery query = isNative ? DeclaredQuery .nativeQuery (queryString ) : DeclaredQuery .jpqlQuery (queryString );
222
+ return StringAotQuery .named (queryName , EntityQuery .create (query , selector ));
226
223
}
227
224
228
225
TypedQueryReference <?> namedQuery = getNamedQuery (returnedType , queryName );
229
226
230
227
Assert .state (namedQuery != null , "Native named query must not be null" );
231
228
232
- return createNamedAotQuery (namedQuery , queryMethod , isNative );
229
+ return createNamedAotQuery (namedQuery , selector , isNative , queryMethod );
233
230
}
234
231
235
- private AotQuery createNamedAotQuery (TypedQueryReference <?> namedQuery , JpaQueryMethod queryMethod ,
236
- boolean isNative ) {
232
+ private AotQuery createNamedAotQuery (TypedQueryReference <?> namedQuery , QueryEnhancerSelector selector ,
233
+ boolean isNative , JpaQueryMethod queryMethod ) {
237
234
238
235
QueryExtractor queryExtractor = queryMethod .getQueryExtractor ();
239
236
String queryString = queryExtractor .extractQueryString (namedQuery );
@@ -244,8 +241,9 @@ private AotQuery createNamedAotQuery(TypedQueryReference<?> namedQuery, JpaQuery
244
241
245
242
Assert .hasText (queryString , () -> "Cannot extract Query from named query [%s]" .formatted (namedQuery .getName ()));
246
243
247
- return NamedAotQuery .named (namedQuery .getName (),
248
- isNative ? DeclaredQuery .nativeQuery (queryString ) : DeclaredQuery .jpqlQuery (queryString ));
244
+ DeclaredQuery query = isNative ? DeclaredQuery .nativeQuery (queryString ) : DeclaredQuery .jpqlQuery (queryString );
245
+
246
+ return NamedAotQuery .named (namedQuery .getName (), EntityQuery .create (query , selector ));
249
247
}
250
248
251
249
private @ Nullable TypedQueryReference <?> getNamedQuery (ReturnedType returnedType , String queryName ) {
@@ -266,19 +264,20 @@ private AotQuery createNamedAotQuery(TypedQueryReference<?> namedQuery, JpaQuery
266
264
return null ;
267
265
}
268
266
269
- private AotQueries buildPartTreeQuery (ReturnedType returnedType , RepositoryInformation repositoryInformation ,
267
+ private AotQueries buildPartTreeQuery (RepositoryInformation repositoryInformation , ReturnedType returnedType ,
268
+ QueryEnhancerSelector selector ,
270
269
MergedAnnotation <Query > query , JpaQueryMethod queryMethod ) {
271
270
272
271
PartTree partTree = new PartTree (queryMethod .getName (), repositoryInformation .getDomainType ());
273
272
AotQuery aotQuery = createQuery (partTree , returnedType , queryMethod .getParameters (), templates );
274
273
275
274
if (query .isPresent () && StringUtils .hasText (query .getString ("countQuery" ))) {
276
- return AotQueries .from (aotQuery , StringAotQuery .jpqlQuery (query .getString ("countQuery" )));
275
+ return AotQueries .from (aotQuery , StringAotQuery .of ( DeclaredQuery . jpqlQuery (query .getString ("countQuery" ) )));
277
276
}
278
277
279
- if (hasNamedQuery (queryMethod .getNamedCountQueryName (), returnedType )) {
278
+ if (hasNamedQuery (returnedType , queryMethod .getNamedCountQueryName ())) {
280
279
return AotQueries .from (aotQuery ,
281
- createNamedAotQuery (returnedType , queryMethod .getNamedCountQueryName (), queryMethod , false ));
280
+ createNamedAotQuery (returnedType , selector , queryMethod .getNamedCountQueryName (), queryMethod , false ));
282
281
}
283
282
284
283
AotQuery partTreeCountQuery = createCountQuery (partTree , returnedType , queryMethod .getParameters (), templates );
@@ -318,19 +317,21 @@ private AotQuery createCountQuery(PartTree partTree, ReturnedType returnedType,
318
317
319
318
Class <?> result = queryForEntity ? returnedType .getDomainType () : null ;
320
319
321
- if (query instanceof StringAotQuery sq && sq .hasConstructorExpressionOrDefaultProjection ()) {
322
- return result ;
323
- }
324
-
325
320
if (returnedType .isProjecting ()) {
326
321
327
322
if (returnedType .getReturnedType ().isInterface ()) {
323
+
324
+ if (query .hasConstructorExpressionOrDefaultProjection ()) {
325
+ return result ;
326
+ }
327
+
328
328
return Tuple .class ;
329
329
}
330
330
331
331
return returnedType .getReturnedType ();
332
332
}
333
333
334
+
334
335
return result ;
335
336
}
336
337
0 commit comments