diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/AvgFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/AvgFunction.java index d530e3a28758..4d6560f2d0f7 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/AvgFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/AvgFunction.java @@ -14,7 +14,7 @@ import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.model.domain.DomainType; import org.hibernate.metamodel.model.domain.ReturnableType; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor; import org.hibernate.query.sqm.function.FunctionKind; diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/ChrLiteralEmulation.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/ChrLiteralEmulation.java index 109f88d1fa57..5d5d623691be 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/ChrLiteralEmulation.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/ChrLiteralEmulation.java @@ -9,7 +9,7 @@ import org.hibernate.QueryException; import org.hibernate.metamodel.model.domain.ReturnableType; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor; import org.hibernate.query.sqm.produce.function.ArgumentTypesValidator; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/DynamicDispatchFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/DynamicDispatchFunction.java index 614f8892b925..3d484ce09695 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/DynamicDispatchFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/DynamicDispatchFunction.java @@ -7,7 +7,7 @@ import java.util.List; import org.hibernate.metamodel.model.domain.ReturnableType; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.spi.QueryEngine; import org.hibernate.query.sqm.function.FunctionKind; import org.hibernate.query.sqm.function.SelfRenderingSqmFunction; diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/GenerateSeriesArgumentValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/GenerateSeriesArgumentValidator.java index 509db4a3c0a5..3e0cac454729 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/GenerateSeriesArgumentValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/GenerateSeriesArgumentValidator.java @@ -6,7 +6,7 @@ import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.model.domain.DomainType; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/TruncFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/TruncFunction.java index d7f0fa60179c..99cdc4374f8d 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/TruncFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/TruncFunction.java @@ -8,7 +8,7 @@ import java.util.List; import org.hibernate.metamodel.model.domain.ReturnableType; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.spi.QueryEngine; import org.hibernate.query.sqm.NodeBuilder; import org.hibernate.query.common.TemporalUnit; diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayAndElementArgumentValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayAndElementArgumentValidator.java index a16b4e5d46e6..08f096caf5a8 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayAndElementArgumentValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayAndElementArgumentValidator.java @@ -6,7 +6,7 @@ import java.util.List; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayArgumentValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayArgumentValidator.java index b2acf395cfa1..737957db7ca7 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayArgumentValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayArgumentValidator.java @@ -6,7 +6,7 @@ import java.util.List; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayConstructorFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayConstructorFunction.java index 4784103c3d68..b0470654e56f 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayConstructorFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayConstructorFunction.java @@ -8,7 +8,7 @@ import org.hibernate.metamodel.mapping.JdbcMappingContainer; import org.hibernate.metamodel.model.domain.ReturnableType; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayContainsArgumentValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayContainsArgumentValidator.java index 5fe724ac49a3..b0cc3859fb87 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayContainsArgumentValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayContainsArgumentValidator.java @@ -6,7 +6,7 @@ import java.util.List; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayIncludesArgumentValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayIncludesArgumentValidator.java index a35bbd6b33fc..0e32649a2606 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayIncludesArgumentValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArrayIncludesArgumentValidator.java @@ -6,7 +6,7 @@ import java.util.List; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; import org.hibernate.query.sqm.tree.SqmTypedNode; diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArraysOfSameTypeArgumentValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArraysOfSameTypeArgumentValidator.java index 3d173dca7c47..f9403cd3966e 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArraysOfSameTypeArgumentValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/array/ArraysOfSameTypeArgumentValidator.java @@ -8,7 +8,7 @@ import java.util.Objects; import org.hibernate.metamodel.model.domain.DomainType; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/json/JsonObjectArgumentsValidator.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/json/JsonObjectArgumentsValidator.java index dbc2b1e51d18..a0a908832067 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/json/JsonObjectArgumentsValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/json/JsonObjectArgumentsValidator.java @@ -9,7 +9,7 @@ import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.mapping.JdbcMappingContainer; import org.hibernate.metamodel.model.domain.DomainType; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException; diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlElementFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlElementFunction.java index 222d41e7960f..290cb3153f10 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlElementFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlElementFunction.java @@ -9,7 +9,7 @@ import org.hibernate.type.descriptor.jdbc.XmlHelper; import org.hibernate.metamodel.model.domain.ReturnableType; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.spi.QueryEngine; import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor; import org.hibernate.query.sqm.function.FunctionKind; diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlForestFunction.java b/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlForestFunction.java index 6fb40ebf352a..68c8e1d16bef 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlForestFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/function/xml/XmlForestFunction.java @@ -8,7 +8,7 @@ import org.hibernate.type.descriptor.jdbc.XmlHelper; import org.hibernate.metamodel.model.domain.ReturnableType; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.sqm.function.AbstractSqmSelfRenderingFunctionDescriptor; import org.hibernate.query.sqm.function.FunctionKind; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappingMetamodelImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappingMetamodelImpl.java index bde4377efda6..6039a523947b 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappingMetamodelImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/model/domain/internal/MappingMetamodelImpl.java @@ -43,7 +43,7 @@ import org.hibernate.metamodel.model.domain.JpaMetamodel; import org.hibernate.metamodel.model.domain.ManagedDomainType; import org.hibernate.metamodel.model.domain.NavigableRole; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.sqm.tuple.TupleType; import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor; import org.hibernate.metamodel.spi.EntityRepresentationStrategy; @@ -674,7 +674,7 @@ else if ( sqmExpressible instanceof CompositeSqmPathSource ) { else if ( sqmExpressible instanceof AnonymousTupleSqmPathSource anonymousTupleSqmPathSource ) { return resolveMappingExpressible( - anonymousTupleSqmPathSource.getPathType().resolveExpressible( this ), + resolveExpressible( anonymousTupleSqmPathSource.getPathType() ), tableGroupLocator ); } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/spi/RuntimeMetamodelsImplementor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/RuntimeMetamodelsImplementor.java index 9ba8acb63fd7..96426a1ea4a7 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/spi/RuntimeMetamodelsImplementor.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/spi/RuntimeMetamodelsImplementor.java @@ -6,7 +6,7 @@ import org.hibernate.metamodel.RuntimeMetamodels; import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.type.MappingContext; /** diff --git a/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureCallImpl.java b/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureCallImpl.java index 43dab7744e28..feb6c906078f 100644 --- a/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureCallImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureCallImpl.java @@ -44,6 +44,7 @@ import org.hibernate.query.BindableType; import org.hibernate.query.KeyedPage; import org.hibernate.query.KeyedResultList; +import org.hibernate.query.sqm.NodeBuilder; import org.hibernate.type.OutputableType; import org.hibernate.query.Query; import org.hibernate.query.QueryParameter; @@ -380,7 +381,7 @@ public ProcedureCall markAsFunctionCall(BindableType typeReference) { } if ( resultSetMapping.getNumberOfResultBuilders() == 0 ) { final SqmExpressible expressible = - typeReference.resolveExpressible( getSessionFactory().getRuntimeMetamodels() ); + getSessionFactory().getRuntimeMetamodels().resolveExpressible( typeReference ); // Function returns might not be represented as callable parameters, // but we still want to convert the result to the requested java type if possible resultSetMapping.addResultBuilder( new ScalarDomainResultBuilder<>( expressible.getExpressibleJavaType() ) ); @@ -499,7 +500,7 @@ public ProcedureParameter registerParameter( BindableType typeReference, ParameterMode mode) { final SqmExpressible expressible = - typeReference.resolveExpressible( getSessionFactory().getRuntimeMetamodels() ); + getSessionFactory().getRuntimeMetamodels().resolveExpressible( typeReference ); final ProcedureParameterImpl procedureParameter = new ProcedureParameterImpl<>( position, mode, typeReference.getBindableJavaType(), expressible ); registerParameter( procedureParameter ); @@ -530,20 +531,23 @@ private Class getExpressibleJavaType(BindableType parameterType) { return null; } else { - final SqmExpressible sqmExpressible = - parameterType.resolveExpressible( getSessionFactory().getQueryEngine().getCriteriaBuilder() ); + final SqmExpressible sqmExpressible = getNodeBuilder().resolveExpressible( parameterType ); assert sqmExpressible != null; return sqmExpressible.getExpressibleJavaType().getJavaTypeClass(); } } + private NodeBuilder getNodeBuilder() { + return getSessionFactory().getQueryEngine().getCriteriaBuilder(); + } + @Override public ProcedureParameterImplementor registerParameter( String name, BindableType typeReference, ParameterMode mode) { final SqmExpressible expressible = - typeReference.resolveExpressible( getSessionFactory().getRuntimeMetamodels() ); + getSessionFactory().getRuntimeMetamodels().resolveExpressible( typeReference ); final ProcedureParameterImpl parameter = new ProcedureParameterImpl<>( name, mode, typeReference.getBindableJavaType(), expressible ); registerParameter( parameter ); diff --git a/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureParameterMetadataImpl.java b/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureParameterMetadataImpl.java index 492c916ef89d..dd98192a277f 100644 --- a/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureParameterMetadataImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureParameterMetadataImpl.java @@ -154,7 +154,7 @@ public ProcedureParameterImplementor findQueryParameter(String name) { @Override public ProcedureParameterImplementor getQueryParameter(String name) { - final ProcedureParameterImplementor parameter = findQueryParameter( name ); + final var parameter = findQueryParameter( name ); if ( parameter != null ) { return parameter; } @@ -213,8 +213,9 @@ public void visitRegistrations(Consumer> action) { public Set getOrdinalParameterLabels() { final Set labels = new HashSet<>(); visitRegistrations( parameter -> { - if ( parameter.getPosition() != null ) { - labels.add( parameter.getPosition() ); + final Integer position = parameter.getPosition(); + if ( position != null ) { + labels.add( position ); } } ); return labels; diff --git a/hibernate-core/src/main/java/org/hibernate/query/BindableType.java b/hibernate-core/src/main/java/org/hibernate/query/BindableType.java index 273b9c6b7db7..8eedaed3c173 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/BindableType.java +++ b/hibernate-core/src/main/java/org/hibernate/query/BindableType.java @@ -5,11 +5,15 @@ package org.hibernate.query; import org.hibernate.Incubating; -import org.hibernate.Internal; -import org.hibernate.query.sqm.SqmExpressible; /** - * Types that can be used to handle binding {@link Query} parameters + * Represents a type which can be bound to a {@linkplain CommonQueryContract query} + * parameter. An instance of {@code BindableType} may be passed to operations like + * {@link CommonQueryContract#setParameter(int, Object, BindableType)} and + * {@link CommonQueryContract#setParameter(String, Object, BindableType)}. + * + * @implNote Every implementation of this interface must also implement + * the SPI {@link org.hibernate.query.spi.BindableTypeImplementor}. * * @see org.hibernate.type.BasicTypeReference * @see org.hibernate.type.StandardBasicTypes @@ -19,19 +23,7 @@ @Incubating public interface BindableType { /** - * The expected Java type + * The expected Java type of the argument to the query parameter. */ Class getBindableJavaType(); - - default boolean isInstance(J value) { - return getBindableJavaType().isInstance( value ); - } - - /** - * Resolve this parameter type to the corresponding {@link SqmExpressible} - * - * @apiNote This internal operation is a layer-breaker, exposing an SQM-specific type - */ - @Internal - SqmExpressible resolveExpressible(BindingContext bindingContext); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/BindingContext.java b/hibernate-core/src/main/java/org/hibernate/query/BindingContext.java deleted file mode 100644 index b037f805318c..000000000000 --- a/hibernate-core/src/main/java/org/hibernate/query/BindingContext.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * SPDX-License-Identifier: Apache-2.0 - * Copyright Red Hat Inc. and Hibernate Authors - */ -package org.hibernate.query; - -import org.hibernate.Incubating; -import org.hibernate.metamodel.MappingMetamodel; -import org.hibernate.metamodel.model.domain.JpaMetamodel; -import org.hibernate.type.spi.TypeConfiguration; - -/** - * A context within which a {@link BindableType} can be resolved - * to an instance of {@link org.hibernate.query.sqm.SqmExpressible}. - * - * @author Gavin King - * - * @since 7 - * - * @see BindableType#resolveExpressible(BindingContext) - * @see org.hibernate.query.sqm.SqmExpressible#resolveExpressible(BindingContext) - * @see org.hibernate.query.sqm.produce.function.ArgumentsValidator#validate(java.util.List, String, BindingContext) - * @see org.hibernate.query.sqm.internal.TypecheckUtil - */ -@Incubating -public interface BindingContext { - JpaMetamodel getJpaMetamodel(); - - MappingMetamodel getMappingMetamodel(); - - TypeConfiguration getTypeConfiguration(); -} diff --git a/hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java index 87a931f212af..0c4d049935e8 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/query/hql/internal/SemanticQueryBuilder.java @@ -1567,7 +1567,7 @@ else if ( !allowPositionalOrAliases ) { // make sure this selection exists final SqmAliasedNode nodeByPosition; if ( queryPart instanceof SqmQueryGroup ) { - final List> selections = queryPart.getFirstQuerySpec().getSelectClause().getSelections(); + final var selections = queryPart.getFirstQuerySpec().getSelectClause().getSelections(); nodeByPosition = position <= selections.size() ? selections.get( position - 1 ) : null; } else { @@ -1579,7 +1579,11 @@ else if ( !allowPositionalOrAliases ) { query ); } - return new SqmAliasedNodeRef( position, integerDomainType.resolveExpressible( nodeBuilder ), nodeBuilder); + return new SqmAliasedNodeRef( + position, + nodeBuilder.resolveExpressible( integerDomainType ), + nodeBuilder + ); } else if ( child instanceof HqlParser.IdentifierContext identifierContext ) { final String identifierText = visitIdentifier( identifierContext ); @@ -1629,7 +1633,11 @@ else if ( selectableNode instanceof SqmPath path ) { ); } else if ( sqmPosition != 0 ) { - return new SqmAliasedNodeRef( sqmPosition, nodeBuilder.getIntegerType(), nodeBuilder ); + return new SqmAliasedNodeRef( + sqmPosition, + nodeBuilder.getIntegerType(), + nodeBuilder + ); } } else { @@ -1643,7 +1651,11 @@ else if ( sqmPosition != 0 ) { // This is syntactically disallowed throw new SyntaxException( "'collate' is not allowed for alias-based 'order by' or 'group by' items" ); } - return new SqmAliasedNodeRef( correspondingPosition, integerDomainType.resolveExpressible( nodeBuilder ), nodeBuilder ); + return new SqmAliasedNodeRef( + correspondingPosition, + nodeBuilder.resolveExpressible( integerDomainType ), + nodeBuilder + ); } final SqmFrom sqmFrom = diff --git a/hibernate-core/src/main/java/org/hibernate/query/internal/BindingTypeHelper.java b/hibernate-core/src/main/java/org/hibernate/query/internal/BindingTypeHelper.java index 59eeb1915ebe..0782c0b53148 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/internal/BindingTypeHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/query/internal/BindingTypeHelper.java @@ -13,7 +13,7 @@ import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.query.BindableType; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.type.StandardBasicTypes; import org.hibernate.type.descriptor.java.JavaTypeHelper; @@ -41,7 +41,7 @@ public BindableType resolveTemporalPrecision( if ( precision != null ) { final TemporalJavaType temporalJtd; if ( declaredParameterType != null ) { - final SqmExpressible sqmExpressible = declaredParameterType.resolveExpressible( bindingContext ); + final SqmExpressible sqmExpressible = bindingContext.resolveExpressible( declaredParameterType ); if ( !( JavaTypeHelper.isTemporal( sqmExpressible.getExpressibleJavaType() ) ) ) { throw new UnsupportedOperationException( "Cannot treat non-temporal parameter type with temporal precision" diff --git a/hibernate-core/src/main/java/org/hibernate/query/internal/QueryEngineImpl.java b/hibernate-core/src/main/java/org/hibernate/query/internal/QueryEngineImpl.java index f49b8d772a8f..394fd8157453 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/internal/QueryEngineImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/internal/QueryEngineImpl.java @@ -16,7 +16,7 @@ import org.hibernate.internal.util.config.ConfigurationHelper; import org.hibernate.metamodel.MappingMetamodel; import org.hibernate.metamodel.model.domain.JpaMetamodel; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.hql.HqlTranslator; import org.hibernate.query.hql.internal.StandardHqlTranslator; import org.hibernate.query.hql.spi.SqmCreationOptions; diff --git a/hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingImpl.java b/hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingImpl.java index 28530a87c7eb..a99c000e2ba0 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/internal/QueryParameterBindingImpl.java @@ -253,7 +253,7 @@ private void setExplicitTemporalPrecision(TemporalType precision) { } private JavaType determineJavaType(BindableType bindType) { - final SqmExpressible sqmExpressible = bindType.resolveExpressible( getCriteriaBuilder() ); + final SqmExpressible sqmExpressible = getCriteriaBuilder().resolveExpressible( bindType ); assert sqmExpressible != null; return sqmExpressible.getExpressibleJavaType(); } @@ -337,7 +337,7 @@ private Object coerce(T value, BindableType parameterType) { return null; } else { - final SqmExpressible sqmExpressible = parameterType.resolveExpressible( getCriteriaBuilder() ); + final SqmExpressible sqmExpressible = getCriteriaBuilder().resolveExpressible( parameterType ); assert sqmExpressible != null; return sqmExpressible.getExpressibleJavaType().coerce( value, this ); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/spi/AbstractCommonQueryContract.java b/hibernate-core/src/main/java/org/hibernate/query/spi/AbstractCommonQueryContract.java index d4a9bef3671a..0140b596e032 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/spi/AbstractCommonQueryContract.java +++ b/hibernate-core/src/main/java/org/hibernate/query/spi/AbstractCommonQueryContract.java @@ -781,12 +781,15 @@ private void setTypedParameter(int position, TypedParameterValue typedVal } private boolean isInstance(BindableType parameterType, Object value) { - final NodeBuilder nodeBuilder = getSession().getFactory().getQueryEngine().getCriteriaBuilder(); - final SqmExpressible sqmExpressible = parameterType.resolveExpressible( nodeBuilder ); + final SqmExpressible sqmExpressible = getNodeuilder().resolveExpressible( parameterType ); assert sqmExpressible != null; return sqmExpressible.getExpressibleJavaType().isInstance( value ); } + private NodeBuilder getNodeuilder() { + return getSession().getFactory().getQueryEngine().getCriteriaBuilder(); + } + @Override public

CommonQueryContract setParameter(String name, P value, Class

javaType) { final JavaType

javaDescriptor = getJavaType( javaType ); diff --git a/hibernate-core/src/main/java/org/hibernate/query/spi/BindableTypeImplementor.java b/hibernate-core/src/main/java/org/hibernate/query/spi/BindableTypeImplementor.java new file mode 100644 index 000000000000..fe83c377ae74 --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/query/spi/BindableTypeImplementor.java @@ -0,0 +1,31 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.query.spi; + +import org.hibernate.Incubating; +import org.hibernate.query.BindableType; +import org.hibernate.query.sqm.SqmExpressible; + +/** + * SPI-level interface which must be implemented by every implementation of + * {@link BindableType}. + * + * @param the type of the parameter + * + * @apiNote This was introduced to eliminate the leakage of {@link SqmExpressible} + * and {@link org.hibernate.type.spi.TypeConfiguration} into the API + * package {@link org.hibernate.query}. + * + * @since 7.0 + * + * @author Gavin King + */ +@Incubating +public interface BindableTypeImplementor extends BindableType { + /** + * Resolve this parameter type to the corresponding {@link SqmExpressible}. + */ + SqmExpressible resolveExpressible(BindingContext bindingContext); +} diff --git a/hibernate-core/src/main/java/org/hibernate/query/spi/BindingContext.java b/hibernate-core/src/main/java/org/hibernate/query/spi/BindingContext.java new file mode 100644 index 000000000000..a6fbb1e5c8ef --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/query/spi/BindingContext.java @@ -0,0 +1,56 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.query.spi; + +import org.hibernate.Incubating; +import org.hibernate.metamodel.MappingMetamodel; +import org.hibernate.metamodel.model.domain.JpaMetamodel; +import org.hibernate.query.BindableType; +import org.hibernate.query.sqm.SqmExpressible; +import org.hibernate.type.spi.TypeConfiguration; + +/** + * A context within which a {@link BindableType} can be resolved + * to an instance of {@link org.hibernate.query.sqm.SqmExpressible}. + * + * @author Gavin King + * + * @since 7.0 + * + * @see BindableTypeImplementor#resolveExpressible(BindingContext) + * @see org.hibernate.query.sqm.SqmExpressible#resolveExpressible(BindingContext) + * @see org.hibernate.query.sqm.produce.function.ArgumentsValidator#validate(java.util.List, String, BindingContext) + * @see org.hibernate.query.sqm.internal.TypecheckUtil + */ +@Incubating +public interface BindingContext { + JpaMetamodel getJpaMetamodel(); + + MappingMetamodel getMappingMetamodel(); + + TypeConfiguration getTypeConfiguration(); + + /** + * Resolve this parameter type to the corresponding {@link SqmExpressible}. + * + * @param bindableType the {@link BindableType} representing the type of a parameter, + * which may be null if the type is not known + * @return the corresponding {@link SqmExpressible}, or null if the argument was null + * @param the type of the parameter + * + * @since 7.0 + */ + default SqmExpressible resolveExpressible(BindableType bindableType) { + if ( bindableType == null ) { + return null; + } + else if ( bindableType instanceof BindableTypeImplementor implementor) { + return implementor.resolveExpressible( this ); + } + else { + throw new IllegalArgumentException( "BindableType does not implement BindableTypeImplementor" ); + } + } +} diff --git a/hibernate-core/src/main/java/org/hibernate/query/spi/QueryEngine.java b/hibernate-core/src/main/java/org/hibernate/query/spi/QueryEngine.java index dfff838cd44c..0c162389d13c 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/spi/QueryEngine.java +++ b/hibernate-core/src/main/java/org/hibernate/query/spi/QueryEngine.java @@ -9,7 +9,6 @@ import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.dialect.Dialect; import org.hibernate.engine.query.spi.NativeQueryInterpreter; -import org.hibernate.query.BindingContext; import org.hibernate.query.hql.HqlTranslator; import org.hibernate.query.named.NamedObjectRepository; import org.hibernate.query.sqm.NodeBuilder; diff --git a/hibernate-core/src/main/java/org/hibernate/query/spi/QueryParameterBindingValidator.java b/hibernate-core/src/main/java/org/hibernate/query/spi/QueryParameterBindingValidator.java index 103e541e409c..b749390c76e3 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/spi/QueryParameterBindingValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/query/spi/QueryParameterBindingValidator.java @@ -10,7 +10,6 @@ import org.hibernate.query.BindableType; import org.hibernate.query.QueryArgumentException; -import org.hibernate.query.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.type.descriptor.java.JavaType; @@ -40,7 +39,7 @@ public void validate( return; } - final SqmExpressible sqmExpressible = paramType.resolveExpressible(bindingContext); + final SqmExpressible sqmExpressible = bindingContext.resolveExpressible( paramType ); final Class parameterJavaType = paramType.getBindableJavaType() != null ? paramType.getBindableJavaType() diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/SqmExpressible.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/SqmExpressible.java index 8fd56114faff..836d58f17101 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/SqmExpressible.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/SqmExpressible.java @@ -4,8 +4,8 @@ */ package org.hibernate.query.sqm; -import org.hibernate.query.BindableType; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindableTypeImplementor; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.sqm.tree.expression.SqmExpression; import org.hibernate.query.sqm.tree.domain.SqmDomainType; import org.hibernate.type.descriptor.java.JavaType; @@ -18,7 +18,7 @@ * * @author Steve Ebersole */ -public interface SqmExpressible extends BindableType { +public interface SqmExpressible extends BindableTypeImplementor { /** * The Java type descriptor for this expressible */ @@ -28,11 +28,6 @@ default JavaType getRelationalJavaType() { return getExpressibleJavaType(); } - @Override - default boolean isInstance(J value) { - return getExpressibleJavaType().isInstance( value ); - } - @Override default SqmExpressible resolveExpressible(BindingContext bindingContext) { return this; diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/function/SelfRenderingSqmFunction.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/function/SelfRenderingSqmFunction.java index 133e46a4fc1d..8595fb40cbfb 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/function/SelfRenderingSqmFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/function/SelfRenderingSqmFunction.java @@ -49,8 +49,7 @@ public SelfRenderingSqmFunction( NodeBuilder nodeBuilder, String name) { super( name, descriptor, - impliedResultType == null ? null - : impliedResultType.resolveExpressible( nodeBuilder ), + nodeBuilder.resolveExpressible( impliedResultType ), arguments, nodeBuilder ); this.renderer = renderer; this.impliedResultType = impliedResultType; @@ -170,7 +169,7 @@ public Expression convertToSqlAst(SqmToSqlAstConverter walker) { return null; } else { - final SqmExpressible expressibleType = resultType.resolveExpressible( nodeBuilder ); + final SqmExpressible expressibleType = nodeBuilder.resolveExpressible( resultType ); setExpressibleType( expressibleType ); return super.getNodeType(); } @@ -184,7 +183,7 @@ public Expression convertToSqlAst(SqmToSqlAstConverter walker) { if ( resultType == null ) { resultType = determineResultType( walker, walker.getCreationContext().getTypeConfiguration() ); if ( resultType != null ) { - setExpressibleType( resultType.resolveExpressible( nodeBuilder() ) ); + setExpressibleType( nodeBuilder().resolveExpressible( resultType ) ); } } return resultType; diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java index fe575eabf9ef..c1aaa19cf369 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmCriteriaNodeBuilder.java @@ -51,7 +51,7 @@ import org.hibernate.query.BindableType; import org.hibernate.query.spi.ImmutableEntityUpdateQueryHandlingMode; import org.hibernate.query.NullPrecedence; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.metamodel.model.domain.ReturnableType; import org.hibernate.query.SemanticException; import org.hibernate.query.SortDirection; @@ -1595,10 +1595,7 @@ public SqmLiteral literal(T value) { return new SqmLiteralNull<>( this ); } else { - final BindableType valueParamType = getParameterBindType( value ); - final SqmExpressible sqmExpressible = - valueParamType == null ? null : valueParamType.resolveExpressible( this ); - return new SqmLiteral<>( value, sqmExpressible, this ); + return new SqmLiteral<>( value, resolveExpressible( getParameterBindType( value ) ), this ); } } @@ -1644,7 +1641,7 @@ public SqmExpression nullLiteral(Class resultClass) { // if there's no basic type, it might be an entity type final SqmExpressible sqmExpressible = basicTypeForJavaType == null - ? getDomainModel().managedType( resultClass ).resolveExpressible( this ) + ? resolveExpressible( getDomainModel().managedType( resultClass ) ) : basicTypeForJavaType; return new SqmLiteralNull<>( sqmExpressible, this ); } @@ -2129,7 +2126,7 @@ private boolean isInstance(BindableType bindableType, T value) { } else { return bindableType.getBindableJavaType().isInstance( value ) - || bindableType.resolveExpressible( this ).getExpressibleJavaType().isInstance( value ); + || resolveExpressible( bindableType ).getExpressibleJavaType().isInstance( value ); } } @@ -2170,7 +2167,7 @@ private ValueBindJpaCriteriaParameter valueParameter(T value, SqmExpressi return new ValueBindJpaCriteriaParameter<>( bindableType, value, this ); } final T coercedValue = - bindableType.resolveExpressible( this ).getExpressibleJavaType() + resolveExpressible( bindableType ).getExpressibleJavaType() .coerce(value, this::getTypeConfiguration ); if ( isInstance( bindableType, coercedValue ) ) { return new ValueBindJpaCriteriaParameter<>( bindableType, coercedValue, this ); @@ -2192,11 +2189,7 @@ else if ( elementTypeInferenceSource.getNodeType() != null ) { bindableType = elementTypeInferenceSource.getNodeType(); } } - DomainType elementType = null; - if ( bindableType != null ) { - final SqmExpressible sqmExpressible = bindableType.resolveExpressible( this ); - elementType = sqmExpressible.getSqmType(); - } + final DomainType elementType = resolveExpressible( bindableType ).getSqmType(); if ( elementType == null ) { throw new UnsupportedOperationException( "Can't infer collection type based on element expression: " + elementTypeInferenceSource ); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/TypecheckUtil.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/TypecheckUtil.java index 08ece72b3509..6ac0e4dcda78 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/TypecheckUtil.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/TypecheckUtil.java @@ -14,7 +14,7 @@ import org.hibernate.query.sqm.tuple.TupleType; import org.hibernate.metamodel.model.domain.internal.EntityDiscriminatorSqmPathSource; import org.hibernate.persister.entity.EntityPersister; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.SemanticException; import org.hibernate.query.sqm.BinaryArithmeticOperator; import org.hibernate.query.sqm.SqmExpressible; diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentTypesValidator.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentTypesValidator.java index 99c6963bf84a..8c48dbab885f 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentTypesValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentTypesValidator.java @@ -12,7 +12,7 @@ import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.mapping.JdbcMappingContainer; import org.hibernate.query.sqm.tuple.TupleType; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.tree.SqmTypedNode; import org.hibernate.query.sqm.tree.expression.SqmCollation; diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentsValidator.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentsValidator.java index df8282bb4816..dab7cffd91c8 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentsValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/ArgumentsValidator.java @@ -4,7 +4,7 @@ */ package org.hibernate.query.sqm.produce.function; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.sqm.tree.SqmTypedNode; import org.hibernate.sql.ast.tree.SqlAstNode; import org.hibernate.type.spi.TypeConfiguration; diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/StandardArgumentsValidators.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/StandardArgumentsValidators.java index ee449f78f37d..635872d4de28 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/StandardArgumentsValidators.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/produce/function/StandardArgumentsValidators.java @@ -4,7 +4,7 @@ */ package org.hibernate.query.sqm.produce.function; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.sqm.tree.SqmTypedNode; import java.util.List; diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/spi/SqmCreationContext.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/spi/SqmCreationContext.java index 6d6d4c491cad..d715c63f9982 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/spi/SqmCreationContext.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/spi/SqmCreationContext.java @@ -7,7 +7,7 @@ import org.hibernate.Incubating; import org.hibernate.metamodel.MappingMetamodel; import org.hibernate.metamodel.model.domain.JpaMetamodel; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.spi.QueryEngine; import org.hibernate.query.sqm.NodeBuilder; diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java index bd1500510347..a989ee267063 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java @@ -5909,7 +5909,7 @@ private MappingModelExpressible determineValueMapping(SqmExpression sqmExp if ( sqmExpression instanceof SelfRenderingSqmFunction selfRenderingSqmFunction ) { final ReturnableType returnableType = selfRenderingSqmFunction.resolveResultType( this ); return domainModel.resolveMappingExpressible( - returnableType == null ? null : returnableType.resolveExpressible( getCreationContext() ), + getCreationContext().resolveExpressible( returnableType ), this::findTableGroupByPath ); } @@ -6048,7 +6048,7 @@ else if ( paramType instanceof EntityDomainType ) { } private MappingModelExpressible determineValueMapping(SqmParameter sqmParameter, BindableType paramType) { - final SqmExpressible paramSqmType = paramType.resolveExpressible( creationContext ); + final SqmExpressible paramSqmType = creationContext.resolveExpressible( paramType ); if ( paramSqmType instanceof SqmPath sqmPath ) { final MappingModelExpressible modelPart = determineValueMapping( sqmPath ); if ( modelPart instanceof PluralAttributeMapping pluralAttributeMapping ) { diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmBasicValuedSimplePath.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmBasicValuedSimplePath.java index 4a9cd30f783a..2e637bef58d9 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmBasicValuedSimplePath.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmBasicValuedSimplePath.java @@ -147,7 +147,7 @@ else if ( getJavaTypeClass( sqmPathType ) == String.class ) { } private Class getJavaTypeClass(SqmDomainType sqmPathType) { - return sqmPathType.resolveExpressible( nodeBuilder() ) + return nodeBuilder().resolveExpressible( sqmPathType ) .getRelationalJavaType() .getJavaTypeClass(); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmElementAggregateFunction.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmElementAggregateFunction.java index 6bc793795c46..143b5856c617 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmElementAggregateFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmElementAggregateFunction.java @@ -62,7 +62,7 @@ public SqmElementAggregateFunction(SqmPath pluralDomainPath, String functionN @Override public SqmExpressible getExpressible() { - return returnableType == null ? super.getExpressible() : returnableType.resolveExpressible( nodeBuilder() ); + return returnableType == null ? super.getExpressible() : nodeBuilder().resolveExpressible( returnableType ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmIndexAggregateFunction.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmIndexAggregateFunction.java index c2e785471680..aff9823324cb 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmIndexAggregateFunction.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/domain/SqmIndexAggregateFunction.java @@ -66,7 +66,7 @@ public SqmIndexAggregateFunction(SqmPath pluralDomainPath, String functionNam @Override public SqmExpressible getExpressible() { - return returnableType == null ? super.getExpressible() : returnableType.resolveExpressible( nodeBuilder() ); + return returnableType == null ? super.getExpressible() : nodeBuilder().resolveExpressible( returnableType ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/JpaCriteriaParameter.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/JpaCriteriaParameter.java index d6f6e7eec1a9..42b62902326c 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/JpaCriteriaParameter.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/JpaCriteriaParameter.java @@ -39,7 +39,7 @@ public JpaCriteriaParameter( BindableType type, boolean allowsMultiValuedBinding, NodeBuilder nodeBuilder) { - super( toSqmType( type, nodeBuilder ), nodeBuilder ); + super( nodeBuilder.resolveExpressible( type ), nodeBuilder ); this.name = name; this.allowsMultiValuedBinding = allowsMultiValuedBinding; } @@ -50,10 +50,6 @@ protected JpaCriteriaParameter(JpaCriteriaParameter original) { this.allowsMultiValuedBinding = original.allowsMultiValuedBinding; } - private static SqmExpressible toSqmType(BindableType type, NodeBuilder nodeBuilder) { - return type == null ? null : type.resolveExpressible( nodeBuilder ); - } - @Override public JpaCriteriaParameter copy(SqmCopyContext context) { // Don't create a copy of regular parameters because identity is important here @@ -104,7 +100,7 @@ public BindableType getAnticipatedType() { @SuppressWarnings({ "rawtypes", "unchecked" }) @Override public void applyAnticipatedType(BindableType type) { - super.internalApplyInferableType( toSqmType( type, nodeBuilder() ) ); + super.internalApplyInferableType( nodeBuilder().resolveExpressible( type ) ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmCastTarget.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmCastTarget.java index 76e26de492fd..e453ecd5bc4c 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmCastTarget.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmCastTarget.java @@ -90,7 +90,7 @@ public X accept(SemanticQueryWalker walker) { @Override public SqmExpressible getNodeType() { - return type.resolveExpressible( nodeBuilder() ); + return nodeBuilder().resolveExpressible( type ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmDurationUnit.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmDurationUnit.java index ddbc38823ffa..c8d06423b69a 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmDurationUnit.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmDurationUnit.java @@ -47,7 +47,7 @@ public TemporalUnit getUnit() { @Override public SqmExpressible getNodeType() { - return type.resolveExpressible( nodeBuilder() ); + return nodeBuilder().resolveExpressible( type ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmExpressionHelper.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmExpressionHelper.java index afb2248c3073..726904a66ad3 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmExpressionHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmExpressionHelper.java @@ -6,7 +6,7 @@ import org.hibernate.metamodel.model.domain.internal.EmbeddedSqmPathSource; import org.hibernate.query.BindableType; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.common.TemporalUnit; import org.hibernate.query.hql.spi.SqmCreationState; import org.hibernate.query.sqm.BinaryArithmeticOperator; @@ -34,7 +34,7 @@ public static SqmExpressible toSqmType( return null; } else { - final SqmExpressible sqmExpressible = anticipatedType.resolveExpressible( bindingContext ); + final SqmExpressible sqmExpressible = bindingContext.resolveExpressible( anticipatedType ); assert sqmExpressible != null; return sqmExpressible; } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmExtractUnit.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmExtractUnit.java index a8433d90d2db..74c13e22c218 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmExtractUnit.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmExtractUnit.java @@ -47,7 +47,7 @@ public X accept(SemanticQueryWalker walker) { @Override public SqmExpressible getNodeType() { - return type.resolveExpressible( nodeBuilder() ); + return nodeBuilder().resolveExpressible( type ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmHqlNumericLiteral.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmHqlNumericLiteral.java index 7bd1eda1a0ab..535d1e388749 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmHqlNumericLiteral.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmHqlNumericLiteral.java @@ -40,7 +40,7 @@ public SqmHqlNumericLiteral( BasicDomainType type, NodeBuilder criteriaBuilder) { this( literalValue, - interpretCategory( literalValue, type.resolveExpressible( criteriaBuilder ) ), + interpretCategory( literalValue, criteriaBuilder.resolveExpressible( type ) ), type, criteriaBuilder ); this.type = type; } @@ -50,7 +50,7 @@ public SqmHqlNumericLiteral( NumericTypeCategory typeCategory, BasicDomainType type, NodeBuilder criteriaBuilder) { - super( type.resolveExpressible( criteriaBuilder ), criteriaBuilder ); + super( criteriaBuilder.resolveExpressible( type ), criteriaBuilder ); this.literalValue = literalValue; this.typeCategory = typeCategory; this.type = type; diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmToDuration.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmToDuration.java index 0f8e261e219b..5c47c31df729 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmToDuration.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/SqmToDuration.java @@ -22,7 +22,7 @@ public SqmToDuration( SqmDurationUnit unit, ReturnableType type, NodeBuilder nodeBuilder) { - super( type.resolveExpressible( nodeBuilder ), nodeBuilder ); + super( nodeBuilder.resolveExpressible( type ), nodeBuilder ); this.magnitude = magnitude; this.unit = unit; } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/ValueBindJpaCriteriaParameter.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/ValueBindJpaCriteriaParameter.java index 712366ea5a63..201f8273c756 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/ValueBindJpaCriteriaParameter.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/expression/ValueBindJpaCriteriaParameter.java @@ -6,6 +6,7 @@ import org.hibernate.query.BindableType; import org.hibernate.query.sqm.NodeBuilder; +import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.tree.SqmCopyContext; import org.hibernate.query.sqm.tree.SqmRenderContext; @@ -19,7 +20,11 @@ public class ValueBindJpaCriteriaParameter extends JpaCriteriaParameter { public ValueBindJpaCriteriaParameter(BindableType type, T value, NodeBuilder nodeBuilder) { super( null, type, false, nodeBuilder ); - assert value == null || type == null || type.isInstance( value ); + assert value == null || type == null + || ( type instanceof SqmExpressible expressible + // TODO: why does SqmExpressible.getBindableJavaType() return an apparently-wrong type? + ? expressible.getExpressibleJavaType().isInstance( value ) + : type.getBindableJavaType().isInstance( value ) ); this.value = value; } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/predicate/SqmMemberOfPredicate.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/predicate/SqmMemberOfPredicate.java index 795e7c2e6b3b..91c955cee41c 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/predicate/SqmMemberOfPredicate.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/predicate/SqmMemberOfPredicate.java @@ -4,6 +4,7 @@ */ package org.hibernate.query.sqm.tree.predicate; +import org.hibernate.query.BindableType; import org.hibernate.query.SemanticException; import org.hibernate.query.sqm.NodeBuilder; import org.hibernate.query.sqm.SemanticQueryWalker; @@ -36,9 +37,8 @@ public SqmMemberOfPredicate( this.pluralPath = pluralPath; this.leftHandExpression = leftHandExpression; - final SqmExpressible simpleDomainType = - pluralPath.getPluralAttribute().getElementType() - .resolveExpressible( nodeBuilder ); + final BindableType elementType = pluralPath.getPluralAttribute().getElementType(); + final SqmExpressible simpleDomainType = nodeBuilder.resolveExpressible( elementType ); if ( !areTypesComparable( leftHandExpression.getNodeType(), simpleDomainType, nodeBuilder ) ) { throw new SemanticException( diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/select/SqmSubQuery.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/select/SqmSubQuery.java index 37063efacade..08985ffba839 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/select/SqmSubQuery.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/tree/select/SqmSubQuery.java @@ -651,7 +651,7 @@ private void applyInferableType(Class type) { final EntityDomainType entityDescriptor = nodeBuilder.getDomainModel().findEntityType( type ); expressibleType = entityDescriptor != null - ? entityDescriptor.resolveExpressible( nodeBuilder ) + ? nodeBuilder.resolveExpressible( entityDescriptor ) : nodeBuilder.getTypeConfiguration().getBasicTypeForJavaType( type ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/SqlAstCreationContext.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/SqlAstCreationContext.java index a1d79afb3a25..ec689ab2ad12 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/SqlAstCreationContext.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/SqlAstCreationContext.java @@ -8,7 +8,7 @@ import org.hibernate.engine.profile.FetchProfile; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.metamodel.spi.MappingMetamodelImplementor; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.sqm.function.SqmFunctionRegistry; import org.hibernate.type.descriptor.WrapperOptions; diff --git a/hibernate-core/src/main/java/org/hibernate/type/BasicTypeReference.java b/hibernate-core/src/main/java/org/hibernate/type/BasicTypeReference.java index 9f709f92faaa..26f2897aee6b 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/BasicTypeReference.java +++ b/hibernate-core/src/main/java/org/hibernate/type/BasicTypeReference.java @@ -6,17 +6,19 @@ import java.io.Serializable; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindableTypeImplementor; +import org.hibernate.query.spi.BindingContext; import org.hibernate.type.descriptor.converter.spi.BasicValueConverter; -import org.hibernate.query.BindableType; import org.hibernate.query.sqm.SqmExpressible; /** * A basic type reference. * * @author Christian Beikov + * + * @see StandardBasicTypes */ -public final class BasicTypeReference implements BindableType, Serializable { +public final class BasicTypeReference implements BindableTypeImplementor, Serializable { private final String name; private final Class javaType; private final int sqlTypeCode; diff --git a/hibernate-core/src/main/java/org/hibernate/type/ComponentType.java b/hibernate-core/src/main/java/org/hibernate/type/ComponentType.java index d1fd83b976b2..8f5b66819cda 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/ComponentType.java +++ b/hibernate-core/src/main/java/org/hibernate/type/ComponentType.java @@ -34,7 +34,7 @@ import org.hibernate.metamodel.spi.EmbeddableInstantiator; import org.hibernate.metamodel.spi.EmbeddableRepresentationStrategy; import org.hibernate.property.access.spi.PropertyAccess; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.sqm.tree.domain.SqmEmbeddableDomainType; import org.hibernate.type.descriptor.ValueExtractor; import org.hibernate.type.descriptor.jdbc.JdbcType; @@ -49,7 +49,8 @@ * * @author Gavin King */ -public class ComponentType extends AbstractType implements CompositeTypeImplementor, ProcedureParameterExtractionAware { +public class ComponentType extends AbstractType + implements CompositeTypeImplementor, ProcedureParameterExtractionAware { private final Class componentClass; private final boolean mutable; diff --git a/hibernate-core/src/main/java/org/hibernate/type/ProcedureParameterExtractionAware.java b/hibernate-core/src/main/java/org/hibernate/type/ProcedureParameterExtractionAware.java index 0079c5ee3a15..fce4ba768834 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/ProcedureParameterExtractionAware.java +++ b/hibernate-core/src/main/java/org/hibernate/type/ProcedureParameterExtractionAware.java @@ -4,11 +4,14 @@ */ package org.hibernate.type; +import org.hibernate.query.spi.BindableTypeImplementor; + /** * Optional {@link Type} contract for implementations that are aware of * how to extract values from stored procedure OUT/INOUT parameters. * * @author Steve Ebersole */ -public interface ProcedureParameterExtractionAware extends OutputableType { +public interface ProcedureParameterExtractionAware + extends BindableTypeImplementor, OutputableType { } diff --git a/hibernate-core/src/main/java/org/hibernate/type/StandardBasicTypes.java b/hibernate-core/src/main/java/org/hibernate/type/StandardBasicTypes.java index 2d52d48abe94..fc521d5146f6 100644 --- a/hibernate-core/src/main/java/org/hibernate/type/StandardBasicTypes.java +++ b/hibernate-core/src/main/java/org/hibernate/type/StandardBasicTypes.java @@ -33,7 +33,7 @@ import org.hibernate.type.spi.TypeConfiguration; /** - * References to common {@link BasicTypeReference} instances + * References to common instances of {@link BasicTypeReference}. * * @author Gavin King * @author Steve Ebersole diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/type/contributor/ArrayType.java b/hibernate-core/src/test/java/org/hibernate/orm/test/type/contributor/ArrayType.java index cbadf8b5ef58..f7c932dc43f8 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/type/contributor/ArrayType.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/type/contributor/ArrayType.java @@ -10,11 +10,8 @@ import java.sql.SQLException; import org.hibernate.HibernateException; -import org.hibernate.query.BindingContext; import org.hibernate.type.descriptor.WrapperOptions; import org.hibernate.type.descriptor.converter.spi.BasicValueConverter; -import org.hibernate.query.BindableType; -import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.type.descriptor.java.BasicJavaType; import org.hibernate.type.descriptor.java.JavaType; import org.hibernate.type.descriptor.java.StringJavaType; @@ -26,24 +23,13 @@ /** * @author Vlad Mihalcea */ -public class ArrayType implements UserType, BindableType, BasicValueConverter { +public class ArrayType implements UserType, BasicValueConverter { + public static final ArrayType INSTANCE = new ArrayType(); private final BasicJavaType javaType = ArrayJavaType.INSTANCE; private final JdbcType jdbcType = VarcharJdbcType.INSTANCE; - @Override - public Class getBindableJavaType() { - // really a UserType should not implement BindableType - return Array.class; - } - - @Override - public SqmExpressible resolveExpressible(BindingContext bindingContext) { - // really a UserType should not implement BindableType - throw new UnsupportedOperationException(); - } - @Override public int getSqlType() { return jdbcType.getJdbcTypeCode(); diff --git a/hibernate-vector/src/main/java/org/hibernate/vector/VectorArgumentValidator.java b/hibernate-vector/src/main/java/org/hibernate/vector/VectorArgumentValidator.java index 3b94b59ee267..7ad74de0deea 100644 --- a/hibernate-vector/src/main/java/org/hibernate/vector/VectorArgumentValidator.java +++ b/hibernate-vector/src/main/java/org/hibernate/vector/VectorArgumentValidator.java @@ -6,7 +6,7 @@ import java.util.List; -import org.hibernate.query.BindingContext; +import org.hibernate.query.spi.BindingContext; import org.hibernate.query.sqm.SqmExpressible; import org.hibernate.query.sqm.produce.function.ArgumentsValidator; import org.hibernate.query.sqm.produce.function.FunctionArgumentException;