29
29
import org .hibernate .engine .spi .SharedSessionContractImplementor ;
30
30
import org .hibernate .graph .spi .AppliedGraph ;
31
31
import org .hibernate .internal .util .collections .IdentitySet ;
32
- import org .hibernate .metamodel .mapping .MappingModelExpressible ;
33
32
import org .hibernate .query .BindableType ;
34
33
import org .hibernate .query .KeyedPage ;
35
34
import org .hibernate .query .Order ;
@@ -150,22 +149,23 @@ public SqmSelectionQueryImpl(
150
149
Class <R > expectedResultType ,
151
150
SharedSessionContractImplementor session ) {
152
151
super ( session );
153
- this .hql = CRITERIA_HQL_STRING ;
152
+ this .expectedResultType = expectedResultType ;
153
+ hql = CRITERIA_HQL_STRING ;
154
154
if ( session .isCriteriaCopyTreeEnabled () ) {
155
- this . sqm = criteria .copy ( SqmCopyContext .simpleContext () );
155
+ sqm = criteria .copy ( SqmCopyContext .simpleContext () );
156
156
}
157
157
else {
158
- this . sqm = criteria ;
158
+ sqm = criteria ;
159
159
// Cache immutable query plans by default
160
160
setQueryPlanCacheable ( true );
161
161
}
162
162
163
- this . domainParameterXref = DomainParameterXref .from ( sqm );
164
- this . parameterMetadata = domainParameterXref .hasParameters ()
163
+ domainParameterXref = DomainParameterXref .from ( sqm );
164
+ parameterMetadata = domainParameterXref .hasParameters ()
165
165
? new ParameterMetadataImpl ( domainParameterXref .getQueryParameters () )
166
166
: ParameterMetadataImpl .EMPTY ;
167
167
168
- this . parameterBindings = parameterMetadata .createBindings ( session .getFactory () );
168
+ parameterBindings = parameterMetadata .createBindings ( session .getFactory () );
169
169
170
170
// Parameters might be created through HibernateCriteriaBuilder.value which we need to bind here
171
171
for ( SqmParameter <?> sqmParameter : domainParameterXref .getParameterResolutions ().getSqmParameters () ) {
@@ -174,8 +174,7 @@ public SqmSelectionQueryImpl(
174
174
}
175
175
}
176
176
177
- this .expectedResultType = expectedResultType ;
178
- this .resultType = determineResultType ( sqm , expectedResultType );
177
+ resultType = determineResultType ( sqm , expectedResultType );
179
178
180
179
final SqmQueryPart <R > queryPart = sqm .getQueryPart ();
181
180
// For criteria queries, we have to validate the fetch structure here
@@ -185,7 +184,7 @@ public SqmSelectionQueryImpl(
185
184
186
185
setComment ( hql );
187
186
188
- this . tupleMetadata = buildTupleMetadata ( sqm , expectedResultType );
187
+ tupleMetadata = buildTupleMetadata ( sqm , expectedResultType );
189
188
}
190
189
191
190
<E > SqmSelectionQueryImpl (AbstractSqmSelectionQuery <?> original , KeyedPage <E > keyedPage ) {
@@ -199,77 +198,73 @@ <E> SqmSelectionQueryImpl(AbstractSqmSelectionQuery<?> original, KeyedPage<E> ke
199
198
? Order .reverse ( keyDefinition ) : keyDefinition ;
200
199
201
200
//noinspection unchecked
202
- this . sqm = (SqmSelectStatement <R >) paginate (
201
+ sqm = (SqmSelectStatement <R >) paginate (
203
202
appliedKeyDefinition ,
204
203
key ,
205
204
// Change the query source to CRITERIA, because we will change the query and introduce parameters
206
205
(SqmSelectStatement <KeyedResult <E >>) original .getSqmStatement ()
207
206
.copy ( noParamCopyContext ( SqmQuerySource .CRITERIA ) ),
208
207
original .getSqmStatement ().nodeBuilder ()
209
208
);
210
- this . hql = CRITERIA_HQL_STRING ;
209
+ hql = CRITERIA_HQL_STRING ;
211
210
212
- this . domainParameterXref = DomainParameterXref .from ( sqm );
213
- this . parameterMetadata = domainParameterXref .hasParameters ()
211
+ domainParameterXref = DomainParameterXref .from ( sqm );
212
+ parameterMetadata = domainParameterXref .hasParameters ()
214
213
? new ParameterMetadataImpl ( domainParameterXref .getQueryParameters () )
215
214
: ParameterMetadataImpl .EMPTY ;
216
215
217
216
// Just use the original parameter bindings since this object is never going to be mutated
218
- this .parameterBindings = parameterMetadata .createBindings ( original .getSession ().getSessionFactory () );
219
- // Don't remove this cast. This is here to work around this bug: https://bugs.openjdk.org/browse/JDK-8340443
220
- //noinspection RedundantCast
221
- final QueryParameterBindings bindings = ((DomainQueryExecutionContext ) original ).getQueryParameterBindings ();
222
- bindings .visitBindings (
223
- (parameter , binding ) -> {
224
- //noinspection unchecked
225
- final QueryParameterBinding <Object > parameterBinding =
226
- (QueryParameterBinding <Object >) this .parameterBindings .getBinding ( parameter );
227
- final TemporalType explicitTemporalPrecision = binding .getExplicitTemporalPrecision ();
228
- if ( explicitTemporalPrecision != null ) {
229
- if ( binding .isMultiValued () ) {
230
- parameterBinding .setBindValues (
231
- binding .getBindValues (),
232
- explicitTemporalPrecision ,
233
- getSessionFactory ().getTypeConfiguration ()
234
- );
235
- }
236
- else {
237
- parameterBinding .setBindValue ( binding .getBindValue (), explicitTemporalPrecision );
238
- }
239
- }
240
- else {
241
- //noinspection unchecked
242
- final BindableType <Object > bindType = (BindableType <Object >) binding .getBindType ();
243
- if ( binding .isMultiValued () ) {
244
- parameterBinding .setBindValues ( binding .getBindValues (), bindType );
245
- }
246
- else {
247
- parameterBinding .setBindValue ( binding .getBindValue (), bindType );
248
- }
249
- }
250
- //noinspection unchecked
251
- parameterBinding .setType ( (MappingModelExpressible <Object >) binding .getType () );
252
- }
253
- );
217
+ parameterBindings = parameterMetadata .createBindings ( original .getSession ().getSessionFactory () );
218
+ original .getQueryParameterBindings ().visitBindings ( this ::setBindValues );
254
219
255
220
// Parameters might be created through HibernateCriteriaBuilder.value which we need to bind here
256
221
for ( SqmParameter <?> sqmParameter : domainParameterXref .getParameterResolutions ().getSqmParameters () ) {
257
- if ( sqmParameter instanceof SqmJpaCriteriaParameterWrapper <?> ) {
258
- bindCriteriaParameter ( ( SqmJpaCriteriaParameterWrapper <?>) sqmParameter );
222
+ if ( sqmParameter instanceof SqmJpaCriteriaParameterWrapper <?> parameterWrapper ) {
223
+ bindCriteriaParameter ( parameterWrapper );
259
224
}
260
225
}
261
226
262
227
//noinspection unchecked
263
- this . expectedResultType = (Class <R >) KeyedResult .class ;
264
- this . resultType = determineResultType ( sqm , expectedResultType );
265
- this . tupleMetadata = null ;
228
+ expectedResultType = (Class <R >) KeyedResult .class ;
229
+ resultType = determineResultType ( sqm , expectedResultType );
230
+ tupleMetadata = null ;
266
231
267
232
setMaxResults ( page .getMaxResults () + 1 );
268
233
if ( key == null ) {
269
234
setFirstResult ( page .getFirstResult () );
270
235
}
271
236
}
272
237
238
+ private <T > void setBindValues (QueryParameter <?> parameter , QueryParameterBinding <T > binding ) {
239
+ final QueryParameterBinding <?> paramBinding = parameterBindings .getBinding ( parameter );
240
+ //noinspection unchecked
241
+ final QueryParameterBinding <T > parameterBinding = (QueryParameterBinding <T >) paramBinding ;
242
+ final TemporalType explicitTemporalPrecision = binding .getExplicitTemporalPrecision ();
243
+ if ( explicitTemporalPrecision != null ) {
244
+ if ( binding .isMultiValued () ) {
245
+ parameterBinding .setBindValues (
246
+ binding .getBindValues (),
247
+ explicitTemporalPrecision ,
248
+ getSessionFactory ().getTypeConfiguration ()
249
+ );
250
+ }
251
+ else {
252
+ parameterBinding .setBindValue ( binding .getBindValue (), explicitTemporalPrecision );
253
+ }
254
+ }
255
+ else {
256
+ //noinspection unchecked
257
+ final BindableType <T > bindType = (BindableType <T >) binding .getBindType ();
258
+ if ( binding .isMultiValued () ) {
259
+ parameterBinding .setBindValues ( binding .getBindValues (), bindType );
260
+ }
261
+ else {
262
+ parameterBinding .setBindValue ( binding .getBindValue (), bindType );
263
+ }
264
+ }
265
+ parameterBinding .setType ( binding .getType () );
266
+ }
267
+
273
268
274
269
private static Class <?> determineResultType (SqmSelectStatement <?> sqm , Class <?> expectedResultType ) {
275
270
final List <SqmSelection <?>> selections = sqm .getQuerySpec ().getSelectClause ().getSelections ();
0 commit comments