49
49
*/
50
50
abstract class AbstractStringBasedJpaQuery extends AbstractJpaQuery {
51
51
52
- private final DeclaredQuery query ;
53
- private final Lazy <DeclaredQuery > countQuery ;
52
+ private final StringQuery query ;
53
+ private final Lazy <IntrospectedQuery > countQuery ;
54
54
private final ValueExpressionDelegate valueExpressionDelegate ;
55
55
private final QueryRewriter queryRewriter ;
56
56
private final QuerySortRewriter querySortRewriter ;
@@ -65,37 +65,32 @@ abstract class AbstractStringBasedJpaQuery extends AbstractJpaQuery {
65
65
* @param em must not be {@literal null}.
66
66
* @param queryString must not be {@literal null}.
67
67
* @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}.
70
69
*/
71
70
public AbstractStringBasedJpaQuery (JpaQueryMethod method , EntityManager em , String queryString ,
72
- @ Nullable String countQueryString , QueryRewriter queryRewriter , ValueExpressionDelegate valueExpressionDelegate ) {
71
+ @ Nullable String countQueryString , JpaQueryConfiguration queryConfiguration ) {
73
72
74
73
super (method , em );
75
74
76
75
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" );
79
77
80
- this .valueExpressionDelegate = valueExpressionDelegate ;
78
+ this .valueExpressionDelegate = queryConfiguration . getValueExpressionDelegate () ;
81
79
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 );
84
81
85
82
this .countQuery = Lazy .of (() -> {
86
83
87
84
if (StringUtils .hasText (countQueryString )) {
88
-
89
- return new ExpressionBasedStringQuery (countQueryString , method .getEntityInformation (), valueExpressionDelegate ,
90
- method .isNativeQuery ());
85
+ return ExpressionBasedStringQuery .create (countQueryString , method , queryConfiguration );
91
86
}
92
87
93
- return query .deriveCountQuery (method .getCountQueryProjection ());
88
+ return this . query .deriveCountQuery (method .getCountQueryProjection ());
94
89
});
95
90
96
91
this .countParameterBinder = Lazy .of (() -> this .createBinder (this .countQuery .get ()));
97
92
98
- this .queryRewriter = queryRewriter ;
93
+ this .queryRewriter = queryConfiguration . getQueryRewriter ( method ) ;
99
94
100
95
JpaParameters parameters = method .getParameters ();
101
96
@@ -109,7 +104,7 @@ public AbstractStringBasedJpaQuery(JpaQueryMethod method, EntityManager em, Stri
109
104
}
110
105
}
111
106
112
- Assert .isTrue (method .isNativeQuery () || !query .usesJdbcStyleParameters (),
107
+ Assert .isTrue (method .isNativeQuery () || !this . query .usesJdbcStyleParameters (),
113
108
"JDBC style parameters (?) are not supported for JPA queries" );
114
109
}
115
110
@@ -136,7 +131,7 @@ protected ParameterBinder createBinder() {
136
131
return createBinder (query );
137
132
}
138
133
139
- protected ParameterBinder createBinder (DeclaredQuery query ) {
134
+ protected ParameterBinder createBinder (IntrospectedQuery query ) {
140
135
return ParameterBinderFactory .createQueryAwareBinder (getQueryMethod ().getParameters (), query ,
141
136
valueExpressionDelegate , valueExpressionContextProvider );
142
137
}
@@ -160,14 +155,14 @@ protected Query doCreateCountQuery(JpaParametersParameterAccessor accessor) {
160
155
/**
161
156
* @return the query
162
157
*/
163
- public DeclaredQuery getQuery () {
158
+ public EntityQuery getQuery () {
164
159
return query ;
165
160
}
166
161
167
162
/**
168
163
* @return the countQuery
169
164
*/
170
- public DeclaredQuery getCountQuery () {
165
+ public IntrospectedQuery getCountQuery () {
171
166
return countQuery .get ();
172
167
}
173
168
@@ -208,16 +203,15 @@ protected String potentiallyRewriteQuery(String originalQuery, Sort sort, @Nulla
208
203
}
209
204
210
205
String applySorting (CachableQuery cachableQuery ) {
211
-
212
- return QueryEnhancerFactory .forQuery (cachableQuery .getDeclaredQuery ())
206
+ return cachableQuery .getDeclaredQuery ().getQueryEnhancer ()
213
207
.rewrite (new DefaultQueryRewriteInformation (cachableQuery .getSort (), cachableQuery .getReturnedType ()));
214
208
}
215
209
216
210
/**
217
211
* Query Sort Rewriter interface.
218
212
*/
219
213
interface QuerySortRewriter {
220
- String getSorted (DeclaredQuery query , Sort sort , ReturnedType returnedType );
214
+ String getSorted (StringQuery query , Sort sort , ReturnedType returnedType );
221
215
}
222
216
223
217
/**
@@ -227,25 +221,24 @@ enum SimpleQuerySortRewriter implements QuerySortRewriter {
227
221
228
222
INSTANCE ;
229
223
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 ));
233
226
}
234
227
}
235
228
236
229
static class UnsortedCachingQuerySortRewriter implements QuerySortRewriter {
237
230
238
231
private volatile @ Nullable String cachedQueryString ;
239
232
240
- public String getSorted (DeclaredQuery query , Sort sort , ReturnedType returnedType ) {
233
+ public String getSorted (StringQuery query , Sort sort , ReturnedType returnedType ) {
241
234
242
235
if (sort .isSorted ()) {
243
236
throw new UnsupportedOperationException ("NoOpQueryCache does not support sorting" );
244
237
}
245
238
246
239
String cachedQueryString = this .cachedQueryString ;
247
240
if (cachedQueryString == null ) {
248
- this .cachedQueryString = cachedQueryString = QueryEnhancerFactory . forQuery ( query )
241
+ this .cachedQueryString = cachedQueryString = query . getQueryEnhancer ( )
249
242
.rewrite (new DefaultQueryRewriteInformation (sort , returnedType ));
250
243
}
251
244
@@ -264,7 +257,7 @@ class CachingQuerySortRewriter implements QuerySortRewriter {
264
257
private volatile @ Nullable String cachedQueryString ;
265
258
266
259
@ Override
267
- public String getSorted (DeclaredQuery query , Sort sort , ReturnedType returnedType ) {
260
+ public String getSorted (StringQuery query , Sort sort , ReturnedType returnedType ) {
268
261
269
262
if (sort .isUnsorted ()) {
270
263
@@ -289,21 +282,21 @@ public String getSorted(DeclaredQuery query, Sort sort, ReturnedType returnedTyp
289
282
*/
290
283
static class CachableQuery {
291
284
292
- private final DeclaredQuery declaredQuery ;
285
+ private final StringQuery query ;
293
286
private final String queryString ;
294
287
private final Sort sort ;
295
288
private final ReturnedType returnedType ;
296
289
297
- CachableQuery (DeclaredQuery query , Sort sort , ReturnedType returnedType ) {
290
+ CachableQuery (StringQuery query , Sort sort , ReturnedType returnedType ) {
298
291
299
- this .declaredQuery = query ;
292
+ this .query = query ;
300
293
this .queryString = query .getQueryString ();
301
294
this .sort = sort ;
302
295
this .returnedType = returnedType ;
303
296
}
304
297
305
- DeclaredQuery getDeclaredQuery () {
306
- return declaredQuery ;
298
+ StringQuery getDeclaredQuery () {
299
+ return query ;
307
300
}
308
301
309
302
Sort getSort () {
0 commit comments