2929import org .hibernate .engine .spi .SharedSessionContractImplementor ;
3030import org .hibernate .graph .spi .AppliedGraph ;
3131import org .hibernate .internal .util .collections .IdentitySet ;
32- import org .hibernate .metamodel .mapping .MappingModelExpressible ;
3332import org .hibernate .query .BindableType ;
3433import org .hibernate .query .KeyedPage ;
3534import org .hibernate .query .Order ;
@@ -150,22 +149,23 @@ public SqmSelectionQueryImpl(
150149 Class <R > expectedResultType ,
151150 SharedSessionContractImplementor session ) {
152151 super ( session );
153- this .hql = CRITERIA_HQL_STRING ;
152+ this .expectedResultType = expectedResultType ;
153+ hql = CRITERIA_HQL_STRING ;
154154 if ( session .isCriteriaCopyTreeEnabled () ) {
155- this . sqm = criteria .copy ( SqmCopyContext .simpleContext () );
155+ sqm = criteria .copy ( SqmCopyContext .simpleContext () );
156156 }
157157 else {
158- this . sqm = criteria ;
158+ sqm = criteria ;
159159 // Cache immutable query plans by default
160160 setQueryPlanCacheable ( true );
161161 }
162162
163- this . domainParameterXref = DomainParameterXref .from ( sqm );
164- this . parameterMetadata = domainParameterXref .hasParameters ()
163+ domainParameterXref = DomainParameterXref .from ( sqm );
164+ parameterMetadata = domainParameterXref .hasParameters ()
165165 ? new ParameterMetadataImpl ( domainParameterXref .getQueryParameters () )
166166 : ParameterMetadataImpl .EMPTY ;
167167
168- this . parameterBindings = parameterMetadata .createBindings ( session .getFactory () );
168+ parameterBindings = parameterMetadata .createBindings ( session .getFactory () );
169169
170170 // Parameters might be created through HibernateCriteriaBuilder.value which we need to bind here
171171 for ( SqmParameter <?> sqmParameter : domainParameterXref .getParameterResolutions ().getSqmParameters () ) {
@@ -174,8 +174,7 @@ public SqmSelectionQueryImpl(
174174 }
175175 }
176176
177- this .expectedResultType = expectedResultType ;
178- this .resultType = determineResultType ( sqm , expectedResultType );
177+ resultType = determineResultType ( sqm , expectedResultType );
179178
180179 final SqmQueryPart <R > queryPart = sqm .getQueryPart ();
181180 // For criteria queries, we have to validate the fetch structure here
@@ -185,7 +184,7 @@ public SqmSelectionQueryImpl(
185184
186185 setComment ( hql );
187186
188- this . tupleMetadata = buildTupleMetadata ( sqm , expectedResultType );
187+ tupleMetadata = buildTupleMetadata ( sqm , expectedResultType );
189188 }
190189
191190 <E > SqmSelectionQueryImpl (AbstractSqmSelectionQuery <?> original , KeyedPage <E > keyedPage ) {
@@ -199,77 +198,73 @@ <E> SqmSelectionQueryImpl(AbstractSqmSelectionQuery<?> original, KeyedPage<E> ke
199198 ? Order .reverse ( keyDefinition ) : keyDefinition ;
200199
201200 //noinspection unchecked
202- this . sqm = (SqmSelectStatement <R >) paginate (
201+ sqm = (SqmSelectStatement <R >) paginate (
203202 appliedKeyDefinition ,
204203 key ,
205204 // Change the query source to CRITERIA, because we will change the query and introduce parameters
206205 (SqmSelectStatement <KeyedResult <E >>) original .getSqmStatement ()
207206 .copy ( noParamCopyContext ( SqmQuerySource .CRITERIA ) ),
208207 original .getSqmStatement ().nodeBuilder ()
209208 );
210- this . hql = CRITERIA_HQL_STRING ;
209+ hql = CRITERIA_HQL_STRING ;
211210
212- this . domainParameterXref = DomainParameterXref .from ( sqm );
213- this . parameterMetadata = domainParameterXref .hasParameters ()
211+ domainParameterXref = DomainParameterXref .from ( sqm );
212+ parameterMetadata = domainParameterXref .hasParameters ()
214213 ? new ParameterMetadataImpl ( domainParameterXref .getQueryParameters () )
215214 : ParameterMetadataImpl .EMPTY ;
216215
217216 // 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 );
254219
255220 // Parameters might be created through HibernateCriteriaBuilder.value which we need to bind here
256221 for ( SqmParameter <?> sqmParameter : domainParameterXref .getParameterResolutions ().getSqmParameters () ) {
257- if ( sqmParameter instanceof SqmJpaCriteriaParameterWrapper <?> ) {
258- bindCriteriaParameter ( ( SqmJpaCriteriaParameterWrapper <?>) sqmParameter );
222+ if ( sqmParameter instanceof SqmJpaCriteriaParameterWrapper <?> parameterWrapper ) {
223+ bindCriteriaParameter ( parameterWrapper );
259224 }
260225 }
261226
262227 //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 ;
266231
267232 setMaxResults ( page .getMaxResults () + 1 );
268233 if ( key == null ) {
269234 setFirstResult ( page .getFirstResult () );
270235 }
271236 }
272237
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+
273268
274269 private static Class <?> determineResultType (SqmSelectStatement <?> sqm , Class <?> expectedResultType ) {
275270 final List <SqmSelection <?>> selections = sqm .getQuerySpec ().getSelectClause ().getSelections ();
0 commit comments