4848 */
4949abstract class AbstractStringBasedJpaQuery extends AbstractJpaQuery {
5050
51- private final DeclaredQuery query ;
52- private final Lazy <DeclaredQuery > countQuery ;
51+ private final StringQuery query ;
52+ private final Lazy <IntrospectedQuery > countQuery ;
5353 private final ValueExpressionDelegate valueExpressionDelegate ;
5454 private final QueryRewriter queryRewriter ;
5555 private final QuerySortRewriter querySortRewriter ;
@@ -64,37 +64,32 @@ abstract class AbstractStringBasedJpaQuery extends AbstractJpaQuery {
6464 * @param em must not be {@literal null}.
6565 * @param queryString must not be {@literal null}.
6666 * @param countQueryString must not be {@literal null}.
67- * @param queryRewriter must not be {@literal null}.
68- * @param valueExpressionDelegate must not be {@literal null}.
67+ * @param queryConfiguration must not be {@literal null}.
6968 */
7069 public AbstractStringBasedJpaQuery (JpaQueryMethod method , EntityManager em , String queryString ,
71- @ Nullable String countQueryString , QueryRewriter queryRewriter , ValueExpressionDelegate valueExpressionDelegate ) {
70+ @ Nullable String countQueryString , JpaQueryConfiguration queryConfiguration ) {
7271
7372 super (method , em );
7473
7574 Assert .hasText (queryString , "Query string must not be null or empty" );
76- Assert .notNull (valueExpressionDelegate , "ValueExpressionDelegate must not be null" );
77- Assert .notNull (queryRewriter , "QueryRewriter must not be null" );
75+ Assert .notNull (queryConfiguration , "JpaQueryConfiguration must not be null" );
7876
79- this .valueExpressionDelegate = valueExpressionDelegate ;
77+ this .valueExpressionDelegate = queryConfiguration . getValueExpressionDelegate () ;
8078 this .valueExpressionContextProvider = valueExpressionDelegate .createValueContextProvider (method .getParameters ());
81- this .query = new ExpressionBasedStringQuery (queryString , method .getEntityInformation (), valueExpressionDelegate ,
82- method .isNativeQuery ());
79+ this .query = ExpressionBasedStringQuery .create (queryString , method , queryConfiguration );
8380
8481 this .countQuery = Lazy .of (() -> {
8582
8683 if (StringUtils .hasText (countQueryString )) {
87-
88- return new ExpressionBasedStringQuery (countQueryString , method .getEntityInformation (), valueExpressionDelegate ,
89- method .isNativeQuery ());
84+ return ExpressionBasedStringQuery .create (countQueryString , method , queryConfiguration );
9085 }
9186
92- return query .deriveCountQuery (method .getCountQueryProjection ());
87+ return this . query .deriveCountQuery (method .getCountQueryProjection ());
9388 });
9489
9590 this .countParameterBinder = Lazy .of (() -> this .createBinder (this .countQuery .get ()));
9691
97- this .queryRewriter = queryRewriter ;
92+ this .queryRewriter = queryConfiguration . getQueryRewriter ( method ) ;
9893
9994 JpaParameters parameters = method .getParameters ();
10095
@@ -108,7 +103,7 @@ public AbstractStringBasedJpaQuery(JpaQueryMethod method, EntityManager em, Stri
108103 }
109104 }
110105
111- Assert .isTrue (method .isNativeQuery () || !query .usesJdbcStyleParameters (),
106+ Assert .isTrue (method .isNativeQuery () || !this . query .usesJdbcStyleParameters (),
112107 "JDBC style parameters (?) are not supported for JPA queries" );
113108 }
114109
@@ -135,7 +130,7 @@ protected ParameterBinder createBinder() {
135130 return createBinder (query );
136131 }
137132
138- protected ParameterBinder createBinder (DeclaredQuery query ) {
133+ protected ParameterBinder createBinder (IntrospectedQuery query ) {
139134 return ParameterBinderFactory .createQueryAwareBinder (getQueryMethod ().getParameters (), query ,
140135 valueExpressionDelegate , valueExpressionContextProvider );
141136 }
@@ -159,14 +154,14 @@ protected Query doCreateCountQuery(JpaParametersParameterAccessor accessor) {
159154 /**
160155 * @return the query
161156 */
162- public DeclaredQuery getQuery () {
157+ public EntityQuery getQuery () {
163158 return query ;
164159 }
165160
166161 /**
167162 * @return the countQuery
168163 */
169- public DeclaredQuery getCountQuery () {
164+ public IntrospectedQuery getCountQuery () {
170165 return countQuery .get ();
171166 }
172167
@@ -207,16 +202,15 @@ protected String potentiallyRewriteQuery(String originalQuery, Sort sort, @Nulla
207202 }
208203
209204 String applySorting (CachableQuery cachableQuery ) {
210-
211- return QueryEnhancerFactory .forQuery (cachableQuery .getDeclaredQuery ())
205+ return cachableQuery .getDeclaredQuery ().getQueryEnhancer ()
212206 .rewrite (new DefaultQueryRewriteInformation (cachableQuery .getSort (), cachableQuery .getReturnedType ()));
213207 }
214208
215209 /**
216210 * Query Sort Rewriter interface.
217211 */
218212 interface QuerySortRewriter {
219- String getSorted (DeclaredQuery query , Sort sort , ReturnedType returnedType );
213+ String getSorted (StringQuery query , Sort sort , ReturnedType returnedType );
220214 }
221215
222216 /**
@@ -226,25 +220,24 @@ enum SimpleQuerySortRewriter implements QuerySortRewriter {
226220
227221 INSTANCE ;
228222
229- public String getSorted (DeclaredQuery query , Sort sort , ReturnedType returnedType ) {
230-
231- return QueryEnhancerFactory .forQuery (query ).rewrite (new DefaultQueryRewriteInformation (sort , returnedType ));
223+ public String getSorted (StringQuery query , Sort sort , ReturnedType returnedType ) {
224+ return query .getQueryEnhancer ().rewrite (new DefaultQueryRewriteInformation (sort , returnedType ));
232225 }
233226 }
234227
235228 static class UnsortedCachingQuerySortRewriter implements QuerySortRewriter {
236229
237230 private volatile String cachedQueryString ;
238231
239- public String getSorted (DeclaredQuery query , Sort sort , ReturnedType returnedType ) {
232+ public String getSorted (StringQuery query , Sort sort , ReturnedType returnedType ) {
240233
241234 if (sort .isSorted ()) {
242235 throw new UnsupportedOperationException ("NoOpQueryCache does not support sorting" );
243236 }
244237
245238 String cachedQueryString = this .cachedQueryString ;
246239 if (cachedQueryString == null ) {
247- this .cachedQueryString = cachedQueryString = QueryEnhancerFactory . forQuery ( query )
240+ this .cachedQueryString = cachedQueryString = query . getQueryEnhancer ( )
248241 .rewrite (new DefaultQueryRewriteInformation (sort , returnedType ));
249242 }
250243
@@ -263,7 +256,7 @@ class CachingQuerySortRewriter implements QuerySortRewriter {
263256 private volatile String cachedQueryString ;
264257
265258 @ Override
266- public String getSorted (DeclaredQuery query , Sort sort , ReturnedType returnedType ) {
259+ public String getSorted (StringQuery query , Sort sort , ReturnedType returnedType ) {
267260
268261 if (sort .isUnsorted ()) {
269262
@@ -288,21 +281,21 @@ public String getSorted(DeclaredQuery query, Sort sort, ReturnedType returnedTyp
288281 */
289282 static class CachableQuery {
290283
291- private final DeclaredQuery declaredQuery ;
284+ private final StringQuery query ;
292285 private final String queryString ;
293286 private final Sort sort ;
294287 private final ReturnedType returnedType ;
295288
296- CachableQuery (DeclaredQuery query , Sort sort , ReturnedType returnedType ) {
289+ CachableQuery (StringQuery query , Sort sort , ReturnedType returnedType ) {
297290
298- this .declaredQuery = query ;
291+ this .query = query ;
299292 this .queryString = query .getQueryString ();
300293 this .sort = sort ;
301294 this .returnedType = returnedType ;
302295 }
303296
304- DeclaredQuery getDeclaredQuery () {
305- return declaredQuery ;
297+ StringQuery getDeclaredQuery () {
298+ return query ;
306299 }
307300
308301 Sort getSort () {
0 commit comments