4949 */
5050abstract class AbstractStringBasedJpaQuery extends AbstractJpaQuery {
5151
52- private final DeclaredQuery query ;
53- private final Lazy <DeclaredQuery > countQuery ;
52+ private final StringQuery query ;
53+ private final Lazy <IntrospectedQuery > countQuery ;
5454 private final ValueExpressionDelegate valueExpressionDelegate ;
5555 private final QueryRewriter queryRewriter ;
5656 private final QuerySortRewriter querySortRewriter ;
@@ -65,37 +65,32 @@ abstract class AbstractStringBasedJpaQuery extends AbstractJpaQuery {
6565 * @param em must not be {@literal null}.
6666 * @param queryString must not be {@literal null}.
6767 * @param countQueryString must not be {@literal null}.
68- * @param queryRewriter must not be {@literal null}.
69- * @param valueExpressionDelegate must not be {@literal null}.
68+ * @param queryConfiguration must not be {@literal null}.
7069 */
7170 public AbstractStringBasedJpaQuery (JpaQueryMethod method , EntityManager em , String queryString ,
72- @ Nullable String countQueryString , QueryRewriter queryRewriter , ValueExpressionDelegate valueExpressionDelegate ) {
71+ @ Nullable String countQueryString , JpaQueryConfiguration queryConfiguration ) {
7372
7473 super (method , em );
7574
7675 Assert .hasText (queryString , "Query string must not be null or empty" );
77- Assert .notNull (valueExpressionDelegate , "ValueExpressionDelegate must not be null" );
78- Assert .notNull (queryRewriter , "QueryRewriter must not be null" );
76+ Assert .notNull (queryConfiguration , "JpaQueryConfiguration must not be null" );
7977
80- this .valueExpressionDelegate = valueExpressionDelegate ;
78+ this .valueExpressionDelegate = queryConfiguration . getValueExpressionDelegate () ;
8179 this .valueExpressionContextProvider = valueExpressionDelegate .createValueContextProvider (method .getParameters ());
82- this .query = new ExpressionBasedStringQuery (queryString , method .getEntityInformation (), valueExpressionDelegate ,
83- method .isNativeQuery ());
80+ this .query = ExpressionBasedStringQuery .create (queryString , method , queryConfiguration );
8481
8582 this .countQuery = Lazy .of (() -> {
8683
8784 if (StringUtils .hasText (countQueryString )) {
88-
89- return new ExpressionBasedStringQuery (countQueryString , method .getEntityInformation (), valueExpressionDelegate ,
90- method .isNativeQuery ());
85+ return ExpressionBasedStringQuery .create (countQueryString , method , queryConfiguration );
9186 }
9287
93- return query .deriveCountQuery (method .getCountQueryProjection ());
88+ return this . query .deriveCountQuery (method .getCountQueryProjection ());
9489 });
9590
9691 this .countParameterBinder = Lazy .of (() -> this .createBinder (this .countQuery .get ()));
9792
98- this .queryRewriter = queryRewriter ;
93+ this .queryRewriter = queryConfiguration . getQueryRewriter ( method ) ;
9994
10095 JpaParameters parameters = method .getParameters ();
10196
@@ -109,7 +104,7 @@ public AbstractStringBasedJpaQuery(JpaQueryMethod method, EntityManager em, Stri
109104 }
110105 }
111106
112- Assert .isTrue (method .isNativeQuery () || !query .usesJdbcStyleParameters (),
107+ Assert .isTrue (method .isNativeQuery () || !this . query .usesJdbcStyleParameters (),
113108 "JDBC style parameters (?) are not supported for JPA queries" );
114109 }
115110
@@ -136,7 +131,7 @@ protected ParameterBinder createBinder() {
136131 return createBinder (query );
137132 }
138133
139- protected ParameterBinder createBinder (DeclaredQuery query ) {
134+ protected ParameterBinder createBinder (IntrospectedQuery query ) {
140135 return ParameterBinderFactory .createQueryAwareBinder (getQueryMethod ().getParameters (), query ,
141136 valueExpressionDelegate , valueExpressionContextProvider );
142137 }
@@ -160,14 +155,14 @@ protected Query doCreateCountQuery(JpaParametersParameterAccessor accessor) {
160155 /**
161156 * @return the query
162157 */
163- public DeclaredQuery getQuery () {
158+ public EntityQuery getQuery () {
164159 return query ;
165160 }
166161
167162 /**
168163 * @return the countQuery
169164 */
170- public DeclaredQuery getCountQuery () {
165+ public IntrospectedQuery getCountQuery () {
171166 return countQuery .get ();
172167 }
173168
@@ -208,16 +203,15 @@ protected String potentiallyRewriteQuery(String originalQuery, Sort sort, @Nulla
208203 }
209204
210205 String applySorting (CachableQuery cachableQuery ) {
211-
212- return QueryEnhancerFactory .forQuery (cachableQuery .getDeclaredQuery ())
206+ return cachableQuery .getDeclaredQuery ().getQueryEnhancer ()
213207 .rewrite (new DefaultQueryRewriteInformation (cachableQuery .getSort (), cachableQuery .getReturnedType ()));
214208 }
215209
216210 /**
217211 * Query Sort Rewriter interface.
218212 */
219213 interface QuerySortRewriter {
220- String getSorted (DeclaredQuery query , Sort sort , ReturnedType returnedType );
214+ String getSorted (StringQuery query , Sort sort , ReturnedType returnedType );
221215 }
222216
223217 /**
@@ -227,25 +221,24 @@ enum SimpleQuerySortRewriter implements QuerySortRewriter {
227221
228222 INSTANCE ;
229223
230- public String getSorted (DeclaredQuery query , Sort sort , ReturnedType returnedType ) {
231-
232- return QueryEnhancerFactory .forQuery (query ).rewrite (new DefaultQueryRewriteInformation (sort , returnedType ));
224+ public String getSorted (StringQuery query , Sort sort , ReturnedType returnedType ) {
225+ return query .getQueryEnhancer ().rewrite (new DefaultQueryRewriteInformation (sort , returnedType ));
233226 }
234227 }
235228
236229 static class UnsortedCachingQuerySortRewriter implements QuerySortRewriter {
237230
238231 private volatile @ Nullable String cachedQueryString ;
239232
240- public String getSorted (DeclaredQuery query , Sort sort , ReturnedType returnedType ) {
233+ public String getSorted (StringQuery query , Sort sort , ReturnedType returnedType ) {
241234
242235 if (sort .isSorted ()) {
243236 throw new UnsupportedOperationException ("NoOpQueryCache does not support sorting" );
244237 }
245238
246239 String cachedQueryString = this .cachedQueryString ;
247240 if (cachedQueryString == null ) {
248- this .cachedQueryString = cachedQueryString = QueryEnhancerFactory . forQuery ( query )
241+ this .cachedQueryString = cachedQueryString = query . getQueryEnhancer ( )
249242 .rewrite (new DefaultQueryRewriteInformation (sort , returnedType ));
250243 }
251244
@@ -264,7 +257,7 @@ class CachingQuerySortRewriter implements QuerySortRewriter {
264257 private volatile @ Nullable String cachedQueryString ;
265258
266259 @ Override
267- public String getSorted (DeclaredQuery query , Sort sort , ReturnedType returnedType ) {
260+ public String getSorted (StringQuery query , Sort sort , ReturnedType returnedType ) {
268261
269262 if (sort .isUnsorted ()) {
270263
@@ -289,21 +282,21 @@ public String getSorted(DeclaredQuery query, Sort sort, ReturnedType returnedTyp
289282 */
290283 static class CachableQuery {
291284
292- private final DeclaredQuery declaredQuery ;
285+ private final StringQuery query ;
293286 private final String queryString ;
294287 private final Sort sort ;
295288 private final ReturnedType returnedType ;
296289
297- CachableQuery (DeclaredQuery query , Sort sort , ReturnedType returnedType ) {
290+ CachableQuery (StringQuery query , Sort sort , ReturnedType returnedType ) {
298291
299- this .declaredQuery = query ;
292+ this .query = query ;
300293 this .queryString = query .getQueryString ();
301294 this .sort = sort ;
302295 this .returnedType = returnedType ;
303296 }
304297
305- DeclaredQuery getDeclaredQuery () {
306- return declaredQuery ;
298+ StringQuery getDeclaredQuery () {
299+ return query ;
307300 }
308301
309302 Sort getSort () {
0 commit comments