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 }
@@ -162,14 +157,14 @@ protected Query doCreateCountQuery(JpaParametersParameterAccessor accessor) {
162157 /**
163158 * @return the query
164159 */
165- public DeclaredQuery getQuery () {
160+ public EntityQuery getQuery () {
166161 return query ;
167162 }
168163
169164 /**
170165 * @return the countQuery
171166 */
172- public DeclaredQuery getCountQuery () {
167+ public IntrospectedQuery getCountQuery () {
173168 return countQuery .get ();
174169 }
175170
@@ -211,16 +206,15 @@ protected String potentiallyRewriteQuery(String originalQuery, Sort sort, @Nulla
211206 }
212207
213208 String applySorting (CachableQuery cachableQuery ) {
214-
215- return QueryEnhancerFactory .forQuery (cachableQuery .getDeclaredQuery ())
209+ return cachableQuery .getDeclaredQuery ().getQueryEnhancer ()
216210 .rewrite (new DefaultQueryRewriteInformation (cachableQuery .getSort (), cachableQuery .getReturnedType ()));
217211 }
218212
219213 /**
220214 * Query Sort Rewriter interface.
221215 */
222216 interface QuerySortRewriter {
223- String getSorted (DeclaredQuery query , Sort sort , ReturnedType returnedType );
217+ String getSorted (StringQuery query , Sort sort , ReturnedType returnedType );
224218 }
225219
226220 /**
@@ -230,25 +224,24 @@ enum SimpleQuerySortRewriter implements QuerySortRewriter {
230224
231225 INSTANCE ;
232226
233- public String getSorted (DeclaredQuery query , Sort sort , ReturnedType returnedType ) {
234-
235- return QueryEnhancerFactory .forQuery (query ).rewrite (new DefaultQueryRewriteInformation (sort , returnedType ));
227+ public String getSorted (StringQuery query , Sort sort , ReturnedType returnedType ) {
228+ return query .getQueryEnhancer ().rewrite (new DefaultQueryRewriteInformation (sort , returnedType ));
236229 }
237230 }
238231
239232 static class UnsortedCachingQuerySortRewriter implements QuerySortRewriter {
240233
241234 private volatile @ Nullable String cachedQueryString ;
242235
243- public String getSorted (DeclaredQuery query , Sort sort , ReturnedType returnedType ) {
236+ public String getSorted (StringQuery query , Sort sort , ReturnedType returnedType ) {
244237
245238 if (sort .isSorted ()) {
246239 throw new UnsupportedOperationException ("NoOpQueryCache does not support sorting" );
247240 }
248241
249242 String cachedQueryString = this .cachedQueryString ;
250243 if (cachedQueryString == null ) {
251- this .cachedQueryString = cachedQueryString = QueryEnhancerFactory . forQuery ( query )
244+ this .cachedQueryString = cachedQueryString = query . getQueryEnhancer ( )
252245 .rewrite (new DefaultQueryRewriteInformation (sort , returnedType ));
253246 }
254247
@@ -267,7 +260,7 @@ class CachingQuerySortRewriter implements QuerySortRewriter {
267260 private volatile @ Nullable String cachedQueryString ;
268261
269262 @ Override
270- public String getSorted (DeclaredQuery query , Sort sort , ReturnedType returnedType ) {
263+ public String getSorted (StringQuery query , Sort sort , ReturnedType returnedType ) {
271264
272265 if (sort .isUnsorted ()) {
273266
@@ -292,21 +285,21 @@ public String getSorted(DeclaredQuery query, Sort sort, ReturnedType returnedTyp
292285 */
293286 static class CachableQuery {
294287
295- private final DeclaredQuery declaredQuery ;
288+ private final StringQuery query ;
296289 private final String queryString ;
297290 private final Sort sort ;
298291 private final ReturnedType returnedType ;
299292
300- CachableQuery (DeclaredQuery query , Sort sort , ReturnedType returnedType ) {
293+ CachableQuery (StringQuery query , Sort sort , ReturnedType returnedType ) {
301294
302- this .declaredQuery = query ;
295+ this .query = query ;
303296 this .queryString = query .getQueryString ();
304297 this .sort = sort ;
305298 this .returnedType = returnedType ;
306299 }
307300
308- DeclaredQuery getDeclaredQuery () {
309- return declaredQuery ;
301+ StringQuery getDeclaredQuery () {
302+ return query ;
310303 }
311304
312305 Sort getSort () {
0 commit comments