Skip to content

Commit b8076d7

Browse files
committed
some cleanups around QueryParameterBindings
1 parent a9da345 commit b8076d7

File tree

5 files changed

+62
-63
lines changed

5 files changed

+62
-63
lines changed

hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureParamBindings.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.hibernate.engine.spi.SharedSessionContractImplementor;
1414
import org.hibernate.procedure.spi.ProcedureParameterBindingImplementor;
1515
import org.hibernate.procedure.spi.ProcedureParameterImplementor;
16+
import org.hibernate.query.QueryParameter;
1617
import org.hibernate.query.procedure.ProcedureParameterBinding;
1718
import org.hibernate.query.spi.QueryParameterBinding;
1819
import org.hibernate.query.spi.QueryParameterBindings;
@@ -124,7 +125,7 @@ public boolean hasAnyMultiValuedBindings() {
124125
}
125126

126127
@Override
127-
public void visitBindings(BiConsumer<QueryParameterImplementor<?>, QueryParameterBinding<?>> action) {
128+
public void visitBindings(BiConsumer<? super QueryParameter<?>, ? super QueryParameterBinding<?>> action) {
128129
bindingMap.forEach( action );
129130
}
130131

hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingsImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ public boolean hasAnyMultiValuedBindings() {
198198
}
199199

200200
@Override
201-
public void visitBindings(@SuppressWarnings("rawtypes") BiConsumer action) {
201+
public void visitBindings(BiConsumer<? super QueryParameter<?>, ? super QueryParameterBinding<?>> action) {
202202
parameterBindingMap.forEach( action );
203203
}
204204

hibernate-core/src/main/java/org/hibernate/query/spi/AbstractCommonQueryContract.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.Set;
1515

1616
import org.hibernate.FlushMode;
17+
import org.hibernate.Internal;
1718
import org.hibernate.query.QueryFlushMode;
1819
import org.hibernate.HibernateException;
1920
import org.hibernate.LockMode;
@@ -635,7 +636,8 @@ public <T> QueryParameterImplementor<T> getParameter(int position, Class<T> type
635636
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
636637
// Parameter binding handling
637638

638-
protected abstract QueryParameterBindings getQueryParameterBindings();
639+
@Internal // Made public to work around this bug: https://bugs.openjdk.org/browse/JDK-8340443
640+
public abstract QueryParameterBindings getQueryParameterBindings();
639641
protected abstract boolean resolveJdbcParameterTypeIfNecessary();
640642

641643
protected <P> QueryParameterBinding<P> locateBinding(Parameter<P> parameter) {
@@ -1345,10 +1347,9 @@ public CommonQueryContract setProperties(Object bean) {
13451347
final Class<?> clazz = bean.getClass();
13461348
for ( String paramName : getParameterMetadata().getNamedParameterNames() ) {
13471349
try {
1348-
final PropertyAccess propertyAccess = BuiltInPropertyAccessStrategies.BASIC.getStrategy().buildPropertyAccess(
1349-
clazz,
1350-
paramName,
1351-
true );
1350+
final PropertyAccess propertyAccess =
1351+
BuiltInPropertyAccessStrategies.BASIC.getStrategy()
1352+
.buildPropertyAccess( clazz, paramName, true );
13521353
final Getter getter = propertyAccess.getGetter();
13531354
final Class<?> retType = getter.getReturnTypeClass();
13541355
final Object object = getter.get( bean );

hibernate-core/src/main/java/org/hibernate/query/spi/QueryParameterBindings.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,15 +82,17 @@ default <P> QueryParameterBinding<P> getBinding(QueryParameter<P> parameter) {
8282
*/
8383
QueryKey.ParameterBindingsMemento generateQueryKeyMemento(SharedSessionContractImplementor persistenceContext);
8484

85-
void visitBindings(BiConsumer<QueryParameterImplementor<?>, QueryParameterBinding<?>> action);
85+
void visitBindings(BiConsumer<? super QueryParameter<?>, ? super QueryParameterBinding<?>> action);
8686

8787
QueryKey.ParameterBindingsMemento NO_PARAMETER_BINDING_MEMENTO = new QueryKey.ParameterBindingsMemento(){
8888
};
8989

9090
/**
9191
* @deprecated Use {@link #empty()} instead.
92+
* Currently unused and can be safely removed.
9293
*/
9394
@Deprecated(forRemoval = true, since = "6.6")
95+
@SuppressWarnings({"rawtypes", "unchecked"})
9496
QueryParameterBindings NO_PARAM_BINDINGS = new QueryParameterBindings() {
9597
@Override
9698
public boolean isBound(QueryParameterImplementor parameter) {

hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmSelectionQueryImpl.java

Lines changed: 50 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import org.hibernate.engine.spi.SharedSessionContractImplementor;
3030
import org.hibernate.graph.spi.AppliedGraph;
3131
import org.hibernate.internal.util.collections.IdentitySet;
32-
import org.hibernate.metamodel.mapping.MappingModelExpressible;
3332
import org.hibernate.query.BindableType;
3433
import org.hibernate.query.KeyedPage;
3534
import 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

Comments
 (0)