diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/lock/internal/SqlAstBasedLockingStrategy.java b/hibernate-core/src/main/java/org/hibernate/dialect/lock/internal/SqlAstBasedLockingStrategy.java index 68db4f3a38fe..92111017b694 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/lock/internal/SqlAstBasedLockingStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/lock/internal/SqlAstBasedLockingStrategy.java @@ -27,13 +27,14 @@ import org.hibernate.sql.ast.spi.SimpleFromClauseAccessImpl; import org.hibernate.sql.ast.spi.SqlAliasBaseManager; import org.hibernate.sql.ast.spi.SqlExpressionResolver; +import org.hibernate.sql.ast.tree.expression.JdbcParameter; import org.hibernate.sql.ast.tree.from.TableGroup; import org.hibernate.sql.ast.tree.predicate.ComparisonPredicate; import org.hibernate.sql.ast.tree.select.QuerySpec; import org.hibernate.sql.ast.tree.select.SelectStatement; import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; -import org.hibernate.sql.exec.internal.JdbcParameterImpl; +import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcSelectExecutor; @@ -209,8 +210,7 @@ private static void handleRestriction( LoaderSqlAstCreationState sqlAstCreationState, TableGroup rootTableGroup, JdbcParameterBindings jdbcParameterBindings) { - final JdbcMapping jdbcMapping = jdbcValueMapping.getJdbcMapping(); - final JdbcParameterImpl jdbcParameter = new JdbcParameterImpl( jdbcMapping ); + final JdbcParameter jdbcParameter = new SqlTypedMappingJdbcParameter( jdbcValueMapping ); rootQuerySpec.applyPredicate( new ComparisonPredicate( sqlAstCreationState.getSqlExpressionResolver().resolveSqlExpression( @@ -222,8 +222,8 @@ private static void handleRestriction( ) ); - final JdbcParameterBindingImpl jdbcParameterBinding = new JdbcParameterBindingImpl( jdbcMapping, value ); - jdbcParameterBindings.addBinding( jdbcParameter, jdbcParameterBinding ); + final JdbcMapping jdbcMapping = jdbcValueMapping.getJdbcMapping(); + jdbcParameterBindings.addBinding( jdbcParameter, new JdbcParameterBindingImpl( jdbcMapping, value ) ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/temptable/TemporaryTableColumn.java b/hibernate-core/src/main/java/org/hibernate/dialect/temptable/TemporaryTableColumn.java index a78a71378263..5023707b2b2d 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/temptable/TemporaryTableColumn.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/temptable/TemporaryTableColumn.java @@ -6,6 +6,9 @@ import org.hibernate.engine.jdbc.Size; import org.hibernate.metamodel.mapping.JdbcMapping; +import org.hibernate.metamodel.mapping.SqlTypedMapping; + +import org.checkerframework.checker.nullness.qual.Nullable; /** * A column in a IdTable. As these columns mirror the entity id columns, we know a few things about it inherently, @@ -13,7 +16,7 @@ * * @author Steve Ebersole */ -public class TemporaryTableColumn { +public class TemporaryTableColumn implements SqlTypedMapping { private final TemporaryTable containingTable; private final String columnName; private final JdbcMapping jdbcMapping; @@ -57,6 +60,7 @@ public String getColumnName() { return columnName; } + @Override public JdbcMapping getJdbcMapping() { return jdbcMapping; } @@ -80,4 +84,29 @@ public boolean isNullable() { public boolean isPrimaryKey() { return primaryKey; } + + @Override + public @Nullable String getColumnDefinition() { + return sqlTypeName; + } + + @Override + public @Nullable Long getLength() { + return size.getLength(); + } + + @Override + public @Nullable Integer getPrecision() { + return size.getPrecision(); + } + + @Override + public @Nullable Integer getScale() { + return size.getScale(); + } + + @Override + public @Nullable Integer getTemporalPrecision() { + return getJdbcMapping().getJdbcType().isTemporal() ? size.getPrecision() : null; + } } diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/AbstractNaturalIdLoader.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/AbstractNaturalIdLoader.java index 48eb6d8e6cfc..fd1f4cc12567 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/AbstractNaturalIdLoader.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/AbstractNaturalIdLoader.java @@ -41,7 +41,7 @@ import org.hibernate.sql.exec.internal.CallbackImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; -import org.hibernate.sql.exec.internal.JdbcParameterImpl; +import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter; import org.hibernate.sql.exec.spi.Callback; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcParameterBinding; @@ -357,7 +357,7 @@ void applyRestriction( predicateConsumer.accept( new NullnessPredicate( columnReference ) ); } else { - final JdbcParameter jdbcParameter = new JdbcParameterImpl( jdbcValueMapping.getJdbcMapping() ); + final JdbcParameter jdbcParameter = new SqlTypedMappingJdbcParameter( jdbcValueMapping ); final ComparisonPredicate predicate = new ComparisonPredicate( columnReference, ComparisonOperator.EQUAL, jdbcParameter ); predicateConsumer.accept( predicate ); diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionBatchLoaderArrayParam.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionBatchLoaderArrayParam.java index 6b90d2599b33..50f3fe9db2b1 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionBatchLoaderArrayParam.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionBatchLoaderArrayParam.java @@ -18,6 +18,9 @@ import org.hibernate.metamodel.mapping.ForeignKeyDescriptor; import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.mapping.PluralAttributeMapping; +import org.hibernate.metamodel.mapping.SelectableMapping; +import org.hibernate.metamodel.mapping.SqlTypedMapping; +import org.hibernate.metamodel.mapping.internal.SqlTypedMappingImpl; import org.hibernate.query.spi.QueryOptions; import org.hibernate.sql.ast.tree.expression.JdbcParameter; import org.hibernate.sql.ast.tree.from.TableGroup; @@ -25,7 +28,7 @@ import org.hibernate.sql.ast.tree.select.SelectStatement; import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; -import org.hibernate.sql.exec.internal.JdbcParameterImpl; +import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParametersList; @@ -47,7 +50,7 @@ public class CollectionBatchLoaderArrayParam extends AbstractCollectionBatchLoader implements SqlArrayMultiKeyLoader { private final Class keyDomainType; - private final JdbcMapping arrayJdbcMapping; + private final SqlTypedMapping arraySqlTypedMapping; private final JdbcParameter jdbcParameter; private final SelectStatement sqlSelect; private final JdbcOperationQuerySelect jdbcSelectOperation; @@ -68,17 +71,25 @@ public CollectionBatchLoaderArrayParam( } final ForeignKeyDescriptor keyDescriptor = getLoadable().getKeyDescriptor(); - final JdbcMapping jdbcMapping = keyDescriptor.getSingleJdbcMapping(); + final SelectableMapping selectable = keyDescriptor.getSelectable( 0 ); + final JdbcMapping jdbcMapping = selectable.getJdbcMapping(); final Class jdbcJavaTypeClass = jdbcMapping.getJdbcJavaType().getJavaTypeClass(); keyDomainType = getKeyType( keyDescriptor.getKeyPart() ); - arrayJdbcMapping = MultiKeyLoadHelper.resolveArrayJdbcMapping( - jdbcMapping, - jdbcJavaTypeClass, - getSessionFactory() + arraySqlTypedMapping = new SqlTypedMappingImpl( + selectable.getColumnDefinition(), + selectable.getLength(), + selectable.getPrecision(), + selectable.getScale(), + selectable.getTemporalPrecision(), + MultiKeyLoadHelper.resolveArrayJdbcMapping( + jdbcMapping, + jdbcJavaTypeClass, + getSessionFactory() + ) ); - jdbcParameter = new JdbcParameterImpl( arrayJdbcMapping ); + jdbcParameter = new SqlTypedMappingJdbcParameter( arraySqlTypedMapping ); sqlSelect = LoaderSelectBuilder.createSelectBySingleArrayParameter( getLoadable(), keyDescriptor.getKeyPart(), @@ -178,7 +189,7 @@ void initializeKeys(Object key, Object[] keysToInitialize, SharedSessionContract final JdbcParameterBindings jdbcParameterBindings = new JdbcParameterBindingsImpl(1); jdbcParameterBindings.addBinding( jdbcParameter, - new JdbcParameterBindingImpl( arrayJdbcMapping, keysToInitialize ) + new JdbcParameterBindingImpl( arraySqlTypedMapping.getJdbcMapping(), keysToInitialize ) ); final SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler = SubselectFetch.createRegistrationHandler( diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/DatabaseSnapshotExecutor.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/DatabaseSnapshotExecutor.java index 2251b5eaf7bb..140155032c36 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/DatabaseSnapshotExecutor.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/DatabaseSnapshotExecutor.java @@ -32,7 +32,7 @@ import org.hibernate.sql.ast.tree.select.SelectStatement; import org.hibernate.sql.exec.internal.BaseExecutionContext; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; -import org.hibernate.sql.exec.internal.JdbcParameterImpl; +import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParametersList; @@ -110,7 +110,7 @@ class DatabaseSnapshotExecutor { selection.getContainingTableExpression() ); - final JdbcParameter jdbcParameter = new JdbcParameterImpl( selection.getJdbcMapping() ); + final JdbcParameter jdbcParameter = new SqlTypedMappingJdbcParameter( selection ); jdbcParametersBuilder.add( jdbcParameter ); final ColumnReference columnReference = (ColumnReference) sqlExpressionResolver diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/EntityBatchLoaderArrayParam.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/EntityBatchLoaderArrayParam.java index c837e16735b7..a11f58109cce 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/EntityBatchLoaderArrayParam.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/EntityBatchLoaderArrayParam.java @@ -14,15 +14,17 @@ import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.build.AllowReflection; import org.hibernate.loader.ast.spi.SqlArrayMultiKeyLoader; -import org.hibernate.metamodel.mapping.BasicEntityIdentifierMapping; import org.hibernate.metamodel.mapping.EntityIdentifierMapping; import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.mapping.JdbcMapping; +import org.hibernate.metamodel.mapping.SelectableMapping; +import org.hibernate.metamodel.mapping.SqlTypedMapping; +import org.hibernate.metamodel.mapping.internal.SqlTypedMappingImpl; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.query.spi.QueryOptions; import org.hibernate.sql.ast.tree.expression.JdbcParameter; import org.hibernate.sql.ast.tree.select.SelectStatement; -import org.hibernate.sql.exec.internal.JdbcParameterImpl; +import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcParameterBindings; @@ -43,8 +45,8 @@ public class EntityBatchLoaderArrayParam implements SqlArrayMultiKeyLoader { private final int domainBatchSize; - private final BasicEntityIdentifierMapping identifierMapping; - private final JdbcMapping arrayJdbcMapping; + private final EntityIdentifierMapping identifierMapping; + private final SqlTypedMapping arraySqlTypedMapping; private final JdbcParameter jdbcParameter; private final SelectStatement sqlAst; private final JdbcOperationQuerySelect jdbcSelectOperation; @@ -76,14 +78,23 @@ public EntityBatchLoaderArrayParam( ); } - identifierMapping = (BasicEntityIdentifierMapping) getLoadable().getIdentifierMapping(); - arrayJdbcMapping = MultiKeyLoadHelper.resolveArrayJdbcMapping( - identifierMapping.getJdbcMapping(), - identifierMapping.getJavaType().getJavaTypeClass(), - sessionFactory + identifierMapping = getLoadable().getIdentifierMapping(); + final SelectableMapping selectable = identifierMapping.getSelectable( 0 ); + final JdbcMapping jdbcMapping = selectable.getJdbcMapping(); + arraySqlTypedMapping = new SqlTypedMappingImpl( + selectable.getColumnDefinition(), + selectable.getLength(), + selectable.getPrecision(), + selectable.getScale(), + selectable.getTemporalPrecision(), + MultiKeyLoadHelper.resolveArrayJdbcMapping( + jdbcMapping, + jdbcMapping.getJdbcJavaType().getJavaTypeClass(), + sessionFactory + ) ); - jdbcParameter = new JdbcParameterImpl( arrayJdbcMapping ); + jdbcParameter = new SqlTypedMappingJdbcParameter( arraySqlTypedMapping ); sqlAst = LoaderSelectBuilder.createSelectBySingleArrayParameter( getLoadable(), identifierMapping, @@ -140,7 +151,7 @@ protected void initializeEntities( sqlAst, jdbcSelectOperation, jdbcParameter, - arrayJdbcMapping, + arraySqlTypedMapping.getJdbcMapping(), id, entityInstance, getLoadable().getRootEntityDescriptor(), diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSelectBuilder.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSelectBuilder.java index d247d7c6a9d3..a8effe4c350d 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSelectBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSelectBuilder.java @@ -70,7 +70,7 @@ import org.hibernate.sql.ast.tree.select.QueryPart; import org.hibernate.sql.ast.tree.select.QuerySpec; import org.hibernate.sql.ast.tree.select.SelectStatement; -import org.hibernate.sql.exec.internal.JdbcParameterImpl; +import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter; import org.hibernate.sql.results.graph.BiDirectionalFetch; import org.hibernate.sql.results.graph.DomainResult; import org.hibernate.sql.results.graph.EntityGraphTraversalState; @@ -613,7 +613,7 @@ private void applyRestriction( (ColumnReference) sqlExpressionResolver.resolveSqlExpression( tableReference, selection ); if ( numberOfKeysToLoad == 1 ) { - final JdbcParameter jdbcParameter = new JdbcParameterImpl( selection.getJdbcMapping() ); + final JdbcParameter jdbcParameter = new SqlTypedMappingJdbcParameter( selection ); jdbcParameterConsumer.accept( jdbcParameter ); rootQuerySpec.applyPredicate( @@ -623,12 +623,10 @@ private void applyRestriction( else { final InListPredicate predicate = new InListPredicate( columnRef ); for ( int i = 0; i < numberOfKeysToLoad; i++ ) { - for ( int j = 0; j < numberColumns; j++ ) { - final JdbcParameter jdbcParameter = - new JdbcParameterImpl( columnRef.getJdbcMapping() ); - jdbcParameterConsumer.accept( jdbcParameter ); - predicate.addExpression( jdbcParameter ); - } + final JdbcParameter jdbcParameter = + new SqlTypedMappingJdbcParameter( selection ); + jdbcParameterConsumer.accept( jdbcParameter ); + predicate.addExpression( jdbcParameter ); } rootQuerySpec.applyPredicate( predicate ); } @@ -656,12 +654,13 @@ private void applyRestriction( for ( int i = 0; i < numberOfKeysToLoad; i++ ) { final List tupleParams = new ArrayList<>( numberColumns ); - for ( int j = 0; j < numberColumns; j++ ) { - final ColumnReference columnReference = columnReferences.get( j ); - final JdbcParameter jdbcParameter = new JdbcParameterImpl( columnReference.getJdbcMapping() ); - jdbcParameterConsumer.accept( jdbcParameter ); - tupleParams.add( jdbcParameter ); - } + restrictedPart.forEachSelectable( + (columnIndex, selection) -> { + final JdbcParameter jdbcParameter = new SqlTypedMappingJdbcParameter( selection ); + jdbcParameterConsumer.accept( jdbcParameter ); + tupleParams.add( jdbcParameter ); + } + ); final SqlTuple paramTuple = new SqlTuple( tupleParams, restrictedPart ); predicate.addExpression( paramTuple ); } diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiIdEntityLoaderArrayParam.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiIdEntityLoaderArrayParam.java index 9778970fbbd4..fac017fba41c 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiIdEntityLoaderArrayParam.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiIdEntityLoaderArrayParam.java @@ -16,8 +16,12 @@ import org.hibernate.loader.ast.spi.MultiIdLoadOptions; import org.hibernate.loader.ast.spi.SqlArrayMultiKeyLoader; import org.hibernate.metamodel.mapping.BasicEntityIdentifierMapping; +import org.hibernate.metamodel.mapping.EntityIdentifierMapping; import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.mapping.JdbcMapping; +import org.hibernate.metamodel.mapping.SelectableMapping; +import org.hibernate.metamodel.mapping.SqlTypedMapping; +import org.hibernate.metamodel.mapping.internal.SqlTypedMappingImpl; import org.hibernate.query.spi.QueryOptions; import org.hibernate.query.spi.QueryOptionsAdapter; import org.hibernate.sql.ast.SqlAstTranslator; @@ -25,7 +29,7 @@ import org.hibernate.sql.ast.tree.select.SelectStatement; import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; -import org.hibernate.sql.exec.internal.JdbcParameterImpl; +import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParametersList; @@ -47,7 +51,7 @@ */ public class MultiIdEntityLoaderArrayParam extends AbstractMultiIdEntityLoader implements SqlArrayMultiKeyLoader { - private final JdbcMapping arrayJdbcMapping; + private final SqlTypedMapping arraySqlTypedMapping; private final JdbcParameter jdbcParameter; protected final Object[] idArray; @@ -56,11 +60,24 @@ public MultiIdEntityLoaderArrayParam( EntityMappingType entityDescriptor, SessionFactoryImplementor sessionFactory) { super( entityDescriptor, sessionFactory ); + final EntityIdentifierMapping identifierMapping = entityDescriptor.getIdentifierMapping(); + final SelectableMapping selectable = identifierMapping.getSelectable( 0 ); + final JdbcMapping jdbcMapping = selectable.getJdbcMapping(); final Class idClass = identifierMapping.getJavaType().getJavaTypeClass(); idArray = (Object[]) Array.newInstance( idClass, 0 ); - arrayJdbcMapping = - resolveArrayJdbcMapping( getIdentifierMapping().getJdbcMapping(), idClass, getSessionFactory() ); - jdbcParameter = new JdbcParameterImpl( arrayJdbcMapping ); + arraySqlTypedMapping = new SqlTypedMappingImpl( + selectable.getColumnDefinition(), + selectable.getLength(), + selectable.getPrecision(), + selectable.getScale(), + selectable.getTemporalPrecision(), + resolveArrayJdbcMapping( + jdbcMapping, + jdbcMapping.getJdbcJavaType().getJavaTypeClass(), + sessionFactory + ) + ); + jdbcParameter = new SqlTypedMappingJdbcParameter( arraySqlTypedMapping ); } @Override @@ -93,7 +110,10 @@ protected void loadEntitiesById( ); final JdbcParameterBindings bindings = new JdbcParameterBindingsImpl(1); - bindings.addBinding( jdbcParameter, new JdbcParameterBindingImpl( arrayJdbcMapping, toIdArray( idsInBatch ) ) ); + bindings.addBinding( + jdbcParameter, + new JdbcParameterBindingImpl( arraySqlTypedMapping.getJdbcMapping(), toIdArray( idsInBatch ) ) + ); final SqlAstTranslator sqlAstTranslator = getSqlAstTranslatorFactory() .buildSelectTranslator( getSessionFactory(), sqlAst ); @@ -152,7 +172,7 @@ protected void loadEntitiesWithUnresolvedIds( sqlAst, jdbcSelectOperation, jdbcParameter, - arrayJdbcMapping, + arraySqlTypedMapping.getJdbcMapping(), null, null, null, diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiNaturalIdLoaderArrayParam.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiNaturalIdLoaderArrayParam.java index 8b2915ec308f..3ee4742e73bc 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiNaturalIdLoaderArrayParam.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiNaturalIdLoaderArrayParam.java @@ -13,12 +13,15 @@ import org.hibernate.loader.ast.spi.SqlArrayMultiKeyLoader; import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.mapping.JdbcMapping; +import org.hibernate.metamodel.mapping.SelectableMapping; +import org.hibernate.metamodel.mapping.SqlTypedMapping; import org.hibernate.metamodel.mapping.internal.BasicAttributeMapping; import org.hibernate.metamodel.mapping.internal.SimpleNaturalIdMapping; +import org.hibernate.metamodel.mapping.internal.SqlTypedMappingImpl; import org.hibernate.query.spi.QueryOptionsAdapter; import org.hibernate.sql.ast.tree.expression.JdbcParameter; import org.hibernate.sql.ast.tree.select.SelectStatement; -import org.hibernate.sql.exec.internal.JdbcParameterImpl; +import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcParameterBindings; @@ -52,12 +55,21 @@ public List loadEntitiesWithUnresolvedIds( LockOptions lockOptions, SharedSessionContractImplementor session) { final SessionFactoryImplementor factory = session.getFactory(); - final JdbcMapping arrayJdbcMapping = MultiKeyLoadHelper.resolveArrayJdbcMapping( - getNaturalIdMapping().getSingleJdbcMapping(), - keyClass, - factory + final SelectableMapping selectable = getNaturalIdAttribute().getSelectable( 0 ); + final JdbcMapping jdbcMapping = selectable.getJdbcMapping(); + final SqlTypedMapping arraySqlTypedMapping = new SqlTypedMappingImpl( + selectable.getColumnDefinition(), + selectable.getLength(), + selectable.getPrecision(), + selectable.getScale(), + selectable.getTemporalPrecision(), + MultiKeyLoadHelper.resolveArrayJdbcMapping( + jdbcMapping, + jdbcMapping.getJdbcJavaType().getJavaTypeClass(), + factory + ) ); - final JdbcParameter jdbcParameter = new JdbcParameterImpl( arrayJdbcMapping ); + final JdbcParameter jdbcParameter = new SqlTypedMappingJdbcParameter( arraySqlTypedMapping ); final SelectStatement sqlAst = LoaderSelectBuilder.createSelectBySingleArrayParameter( getLoadable(), getNaturalIdAttribute(), @@ -81,7 +93,7 @@ public LockOptions getLockOptions() { sqlAst, jdbcSelectOperation, jdbcParameter, - arrayJdbcMapping, + arraySqlTypedMapping.getJdbcMapping(), null, null, null, diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteInsertStrategy.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteInsertStrategy.java index a8bccd347820..5605abe65843 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteInsertStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteInsertStrategy.java @@ -126,13 +126,6 @@ public CteInsertStrategy( ); } - if ( !dialect.supportsValuesList() ) { - throw new UnsupportedOperationException( - getClass().getSimpleName() + - " can only be used with Dialects that support VALUES lists" - ); - } - final PersistentClass persistentClass = runtimeModelCreationContext.getMetadata() .getEntityBinding( rootDescriptor.getEntityName() ); final Identifier tableNameIdentifier; diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteMutationStrategy.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteMutationStrategy.java index bce9aa166d7d..7d53030403bb 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteMutationStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteMutationStrategy.java @@ -80,13 +80,6 @@ public CteMutationStrategy( ); } - if ( !dialect.supportsValuesList() ) { - throw new UnsupportedOperationException( - getClass().getSimpleName() + - " can only be used with Dialects that support VALUES lists" - ); - } - this.idCteTable = CteTable.createIdTable( ID_TABLE_NAME, runtimeModelCreationContext.getMetadata().getEntityBinding( rootDescriptor.getEntityName() ) ); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedDeleteHandler.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedDeleteHandler.java index 188887c45c9e..28b5545af36a 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedDeleteHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedDeleteHandler.java @@ -53,7 +53,7 @@ import org.hibernate.sql.ast.tree.select.QuerySpec; import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; -import org.hibernate.sql.exec.internal.JdbcParameterImpl; +import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter; import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.exec.spi.JdbcMutationExecutor; import org.hibernate.sql.exec.spi.JdbcOperationQueryMutation; @@ -112,7 +112,7 @@ public TableBasedDeleteHandler( this.sessionUidParameter = null; } else { - this.sessionUidParameter = new JdbcParameterImpl( sessionUidColumn.getJdbcMapping() ); + this.sessionUidParameter = new SqlTypedMappingJdbcParameter( sessionUidColumn ); } final MultiTableSqmMutationConverter converter = new MultiTableSqmMutationConverter( diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedInsertHandler.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedInsertHandler.java index d3c9c788733c..d6eb5637087a 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedInsertHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedInsertHandler.java @@ -92,7 +92,7 @@ import org.hibernate.sql.ast.tree.update.UpdateStatement; import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; -import org.hibernate.sql.exec.internal.JdbcParameterImpl; +import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter; import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.exec.spi.JdbcOperationQueryMutation; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; @@ -149,7 +149,7 @@ public TableBasedInsertHandler( this.sessionUidParameter = null; } else { - this.sessionUidParameter = new JdbcParameterImpl( sessionUidColumn.getJdbcMapping() ); + this.sessionUidParameter = new SqlTypedMappingJdbcParameter( sessionUidColumn ); } final SqmJdbcExecutionContextAdapter executionContext = SqmJdbcExecutionContextAdapter.omittingLockingAndPaging( context ); final MultiTableSqmMutationConverter sqmConverter = new MultiTableSqmMutationConverter( @@ -606,7 +606,7 @@ private RootTableInserter createRootTableInserter( new ComparisonPredicate( columnReference, ComparisonOperator.EQUAL, - new JdbcParameterImpl( identifierMapping.getJdbcMapping() ) + new SqlTypedMappingJdbcParameter( identifierMapping ) ) ); } @@ -643,7 +643,7 @@ private RootTableInserter createRootTableInserter( } if ( needsIdentifierGeneration( generator, assignsId ) ) { final BasicEntityIdentifierMapping basicIdentifierMapping = (BasicEntityIdentifierMapping) identifierMapping; - final JdbcParameter rootIdentity = new JdbcParameterImpl( basicIdentifierMapping.getJdbcMapping() ); + final JdbcParameter rootIdentity = new SqlTypedMappingJdbcParameter( basicIdentifierMapping ); final List temporaryTableAssignments = new ArrayList<>( 1 ); final ColumnReference idColumnReference = new ColumnReference( (String) null, basicIdentifierMapping ); temporaryTableAssignments.add( new Assignment( idColumnReference, rootIdentity ) ); @@ -651,7 +651,7 @@ private RootTableInserter createRootTableInserter( final int rowNumberIndex = entityTable.getColumns().size() - (entityTable.getSessionUidColumn() == null ? 1 : 2); final TemporaryTableColumn rowNumberColumn = entityTable.getColumns().get( rowNumberIndex ); - final JdbcParameter rowNumber = new JdbcParameterImpl( rowNumberColumn.getJdbcMapping() ); + final JdbcParameter rowNumber = new SqlTypedMappingJdbcParameter( rowNumberColumn ); final UpdateStatement updateStatement = new UpdateStatement( temporaryTableReference, @@ -748,8 +748,8 @@ private RootTableInserter createRootTableInserter( getPrimaryKeyTableColumns( getEntityDescriptor(), entityTable ); assert primaryKeyTableColumns.size() == 1; - final JdbcParameter entityIdentity = new JdbcParameterImpl( identifierMapping.getJdbcMapping() ); - final JdbcParameter rootIdentity = new JdbcParameterImpl( identifierMapping.getJdbcMapping() ); + final JdbcParameter entityIdentity = new SqlTypedMappingJdbcParameter( identifierMapping ); + final JdbcParameter rootIdentity = new SqlTypedMappingJdbcParameter( identifierMapping ); final List temporaryTableAssignments = new ArrayList<>( 1 ); temporaryTableAssignments.add( new Assignment( diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedSoftDeleteHandler.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedSoftDeleteHandler.java index 5b29d20b3fe6..771f94937ae1 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedSoftDeleteHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedSoftDeleteHandler.java @@ -46,7 +46,7 @@ import org.hibernate.sql.ast.tree.update.UpdateStatement; import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; -import org.hibernate.sql.exec.internal.JdbcParameterImpl; +import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter; import org.hibernate.sql.exec.spi.JdbcMutationExecutor; import org.hibernate.sql.exec.spi.JdbcOperationQueryMutation; import org.hibernate.sql.exec.spi.JdbcParameterBindings; @@ -105,7 +105,7 @@ public TableBasedSoftDeleteHandler( this.sessionUidParameter = null; } else { - this.sessionUidParameter = new JdbcParameterImpl( sessionUidColumn.getJdbcMapping() ); + this.sessionUidParameter = new SqlTypedMappingJdbcParameter( sessionUidColumn ); } final MultiTableSqmMutationConverter converter = new MultiTableSqmMutationConverter( diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedUpdateHandler.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedUpdateHandler.java index db108c4c61ce..906c2fd1d67a 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedUpdateHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedUpdateHandler.java @@ -59,7 +59,7 @@ import org.hibernate.sql.ast.tree.update.Assignment; import org.hibernate.sql.ast.tree.update.UpdateStatement; import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl; -import org.hibernate.sql.exec.internal.JdbcParameterImpl; +import org.hibernate.sql.exec.internal.SqlTypedMappingJdbcParameter; import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.exec.spi.JdbcOperationQueryMutation; import org.hibernate.sql.exec.spi.JdbcParameterBindings; @@ -119,7 +119,7 @@ public TableBasedUpdateHandler( this.sessionUidParameter = null; } else { - this.sessionUidParameter = new JdbcParameterImpl( sessionUidColumn.getJdbcMapping() ); + this.sessionUidParameter = new SqlTypedMappingJdbcParameter( sessionUidColumn ); } final SessionFactoryImplementor sessionFactory = getSessionFactory(); final MappingMetamodel domainModel = sessionFactory.getMappingMetamodel(); 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 564dcff37f8a..06e4da5ade55 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 @@ -5884,41 +5884,10 @@ protected Expression consumeSqmParameter( final QueryParameterImplementor queryParameter = domainParameterXref.getQueryParameter( sqmParameter ); final QueryParameterBinding binding = domainParameterBindings.getBinding( queryParameter ); - if ( binding.setType( valueMapping ) ) { - replaceJdbcParametersType( - sqmParameter, - domainParameterXref.getSqmParameters( queryParameter ), - valueMapping - ); - } + binding.setType( valueMapping ); return new SqmParameterInterpretation( jdbcParametersForSqm, valueMapping ); } - private void replaceJdbcParametersType( - SqmParameter sourceSqmParameter, - List> sqmParameters, - MappingModelExpressible valueMapping) { - final JdbcMapping jdbcMapping = valueMapping.getSingleJdbcMapping(); - for ( SqmParameter sqmParameter : sqmParameters ) { - if ( sqmParameter != sourceSqmParameter ) { - sqmParameterMappingModelTypes.put( sqmParameter, valueMapping ); - final List> jdbcParamsForSqmParameter = jdbcParamsBySqmParam.get( sqmParameter ); - if ( jdbcParamsForSqmParameter != null ) { - for ( List parameters : jdbcParamsForSqmParameter ) { - assert parameters.size() == 1; - final JdbcParameter jdbcParameter = parameters.get( 0 ); - if ( ( (SqlExpressible) jdbcParameter ).getJdbcMapping() != jdbcMapping ) { - final JdbcParameter newJdbcParameter = new JdbcParameterImpl( jdbcMapping ); - parameters.set( 0, newJdbcParameter ); - jdbcParameters.getJdbcParameters().remove( jdbcParameter ); - jdbcParameters.getJdbcParameters().add( newJdbcParameter ); - } - } - } - } - } - } - protected Expression consumeSqmParameter(SqmParameter sqmParameter) { if ( sqmParameter.allowMultiValuedBinding() ) { final QueryParameterImplementor domainParam = domainParameterXref.getQueryParameter( sqmParameter );