@@ -112,28 +112,28 @@ private NamedQueries getNamedQueries(@Nullable RepositoryConfigurationSource con
112112 * Creates the {@link AotQueries} used within a specific {@link JpaQueryMethod}.
113113 *
114114 * @param repositoryInformation
115- * @param query
115+ * @param returnedType
116116 * @param selector
117+ * @param query
117118 * @param queryMethod
118- * @param returnedType
119119 * @return
120120 */
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 ) {
123123
124124 if (query .isPresent () && StringUtils .hasText (query .getString ("value" ))) {
125125 return buildStringQuery (repositoryInformation .getDomainType (), returnedType , selector , query , queryMethod );
126126 }
127127
128128 String queryName = queryMethod .getNamedQueryName ();
129- if (hasNamedQuery (queryName , returnedType )) {
129+ if (hasNamedQuery (returnedType , queryName )) {
130130 return buildNamedQuery (returnedType , selector , queryName , query , queryMethod );
131131 }
132132
133- return buildPartTreeQuery (returnedType , repositoryInformation , query , queryMethod );
133+ return buildPartTreeQuery (repositoryInformation , returnedType , selector , query , queryMethod );
134134 }
135135
136- private boolean hasNamedQuery (String queryName , ReturnedType returnedType ) {
136+ private boolean hasNamedQuery (ReturnedType returnedType , String queryName ) {
137137 return namedQueries .hasQuery (queryName ) || getNamedQuery (returnedType , queryName ) != null ;
138138 }
139139
@@ -142,19 +142,15 @@ private AotQueries buildStringQuery(Class<?> domainType, ReturnedType returnedTy
142142
143143 UnaryOperator <String > operator = s -> s .replaceAll ("#\\ {#entityName}" , domainType .getName ());
144144 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 ;
146146 queryFunction = operator .andThen (queryFunction );
147147
148148 String queryString = query .getString ("value" );
149149
150- StringAotQuery aotStringQuery = queryFunction .apply (queryString );
150+ EntityQuery entityQuery = EntityQuery .create (queryFunction .apply (queryString ), selector );
151+ StringAotQuery aotStringQuery = StringAotQuery .of (entityQuery );
151152 String countQuery = query .getString ("countQuery" );
152153
153- EntityQuery entityQuery = EntityQuery .create (aotStringQuery .getQuery (), selector );
154- if (entityQuery .hasConstructorExpression () || entityQuery .isDefaultProjection ()) {
155- aotStringQuery = aotStringQuery .withConstructorExpressionOrDefaultProjection ();
156- }
157-
158154 if (returnedType .isProjecting () && returnedType .hasInputProperties ()
159155 && !returnedType .getReturnedType ().isInterface ()) {
160156
@@ -174,38 +170,38 @@ public ReturnedType getReturnedType() {
174170 }
175171
176172 if (StringUtils .hasText (countQuery )) {
177- return AotQueries .from (aotStringQuery , queryFunction .apply (countQuery ));
173+ return AotQueries .from (aotStringQuery , StringAotQuery . of ( queryFunction .apply (countQuery ) ));
178174 }
179175
180- if (hasNamedQuery (queryMethod .getNamedCountQueryName (), returnedType )) {
176+ if (hasNamedQuery (returnedType , queryMethod .getNamedCountQueryName ())) {
181177 return AotQueries .from (aotStringQuery ,
182- createNamedAotQuery (returnedType , queryMethod .getNamedCountQueryName (), queryMethod , isNative ));
178+ createNamedAotQuery (returnedType , selector , queryMethod .getNamedCountQueryName (), queryMethod , isNative ));
183179 }
184180
185181 String countProjection = query .getString ("countProjection" );
186- return AotQueries .from (aotStringQuery , countProjection , selector );
182+ return AotQueries .withDerivedCountQuery (aotStringQuery , StringAotQuery :: getQuery , countProjection , selector );
187183 }
188184
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 ) {
191187
192188 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 );
195190 String countQuery = query .isPresent () ? query .getString ("countQuery" ) : null ;
196191
197192 if (StringUtils .hasText (countQuery )) {
198193 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 )));
200196 }
201197
202- if (hasNamedQuery (queryMethod .getNamedCountQueryName (), returnedType )) {
198+ if (hasNamedQuery (returnedType , queryMethod .getNamedCountQueryName ())) {
203199 return AotQueries .from (aotQuery ,
204- createNamedAotQuery (returnedType , queryMethod .getNamedCountQueryName (), queryMethod , nativeQuery ));
200+ createNamedAotQuery (returnedType , selector , queryMethod .getNamedCountQueryName (), queryMethod , nativeQuery ));
205201 }
206202
207203 String countProjection = query .isPresent () ? query .getString ("countProjection" ) : null ;
208- return AotQueries .from (aotQuery , it -> {
204+ return AotQueries .withDerivedCountQuery (aotQuery , it -> {
209205
210206 if (it instanceof StringAotQuery sq ) {
211207 return sq .getQuery ();
@@ -215,25 +211,26 @@ private AotQueries buildNamedQuery(ReturnedType returnedType, QueryEnhancerSelec
215211 }, countProjection , selector );
216212 }
217213
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 ) {
220216
221217 if (namedQueries .hasQuery (queryName )) {
222218
223219 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 ));
226223 }
227224
228225 TypedQueryReference <?> namedQuery = getNamedQuery (returnedType , queryName );
229226
230227 Assert .state (namedQuery != null , "Native named query must not be null" );
231228
232- return createNamedAotQuery (namedQuery , queryMethod , isNative );
229+ return createNamedAotQuery (namedQuery , selector , isNative , queryMethod );
233230 }
234231
235- private AotQuery createNamedAotQuery (TypedQueryReference <?> namedQuery , JpaQueryMethod queryMethod ,
236- boolean isNative ) {
232+ private AotQuery createNamedAotQuery (TypedQueryReference <?> namedQuery , QueryEnhancerSelector selector ,
233+ boolean isNative , JpaQueryMethod queryMethod ) {
237234
238235 QueryExtractor queryExtractor = queryMethod .getQueryExtractor ();
239236 String queryString = queryExtractor .extractQueryString (namedQuery );
@@ -244,8 +241,9 @@ private AotQuery createNamedAotQuery(TypedQueryReference<?> namedQuery, JpaQuery
244241
245242 Assert .hasText (queryString , () -> "Cannot extract Query from named query [%s]" .formatted (namedQuery .getName ()));
246243
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 ));
249247 }
250248
251249 private @ Nullable TypedQueryReference <?> getNamedQuery (ReturnedType returnedType , String queryName ) {
@@ -266,19 +264,20 @@ private AotQuery createNamedAotQuery(TypedQueryReference<?> namedQuery, JpaQuery
266264 return null ;
267265 }
268266
269- private AotQueries buildPartTreeQuery (ReturnedType returnedType , RepositoryInformation repositoryInformation ,
267+ private AotQueries buildPartTreeQuery (RepositoryInformation repositoryInformation , ReturnedType returnedType ,
268+ QueryEnhancerSelector selector ,
270269 MergedAnnotation <Query > query , JpaQueryMethod queryMethod ) {
271270
272271 PartTree partTree = new PartTree (queryMethod .getName (), repositoryInformation .getDomainType ());
273272 AotQuery aotQuery = createQuery (partTree , returnedType , queryMethod .getParameters (), templates );
274273
275274 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" ) )));
277276 }
278277
279- if (hasNamedQuery (queryMethod .getNamedCountQueryName (), returnedType )) {
278+ if (hasNamedQuery (returnedType , queryMethod .getNamedCountQueryName ())) {
280279 return AotQueries .from (aotQuery ,
281- createNamedAotQuery (returnedType , queryMethod .getNamedCountQueryName (), queryMethod , false ));
280+ createNamedAotQuery (returnedType , selector , queryMethod .getNamedCountQueryName (), queryMethod , false ));
282281 }
283282
284283 AotQuery partTreeCountQuery = createCountQuery (partTree , returnedType , queryMethod .getParameters (), templates );
@@ -318,19 +317,21 @@ private AotQuery createCountQuery(PartTree partTree, ReturnedType returnedType,
318317
319318 Class <?> result = queryForEntity ? returnedType .getDomainType () : null ;
320319
321- if (query instanceof StringAotQuery sq && sq .hasConstructorExpressionOrDefaultProjection ()) {
322- return result ;
323- }
324-
325320 if (returnedType .isProjecting ()) {
326321
327322 if (returnedType .getReturnedType ().isInterface ()) {
323+
324+ if (query .hasConstructorExpressionOrDefaultProjection ()) {
325+ return result ;
326+ }
327+
328328 return Tuple .class ;
329329 }
330330
331331 return returnedType .getReturnedType ();
332332 }
333333
334+
334335 return result ;
335336 }
336337
0 commit comments