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 b46c49faa07a..68e564e04ecd 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 @@ -8,6 +8,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, @@ -15,7 +18,7 @@ * * @author Steve Ebersole */ -public class TemporaryTableColumn { +public class TemporaryTableColumn implements SqlTypedMapping { private final TemporaryTable containingTable; private final String columnName; private final JdbcMapping jdbcMapping; @@ -59,6 +62,7 @@ public String getColumnName() { return columnName; } + @Override public JdbcMapping getJdbcMapping() { return jdbcMapping; } @@ -82,4 +86,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/CollectionBatchLoaderArrayParam.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionBatchLoaderArrayParam.java index fb578add5306..116de2ac49f8 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 @@ -19,10 +19,10 @@ import org.hibernate.loader.ast.spi.SqlArrayMultiKeyLoader; import org.hibernate.metamodel.mapping.ForeignKeyDescriptor; import org.hibernate.metamodel.mapping.JdbcMapping; -import org.hibernate.metamodel.mapping.NonAggregatedIdentifierMapping; import org.hibernate.metamodel.mapping.PluralAttributeMapping; -import org.hibernate.metamodel.mapping.ValuedModelPart; -import org.hibernate.metamodel.mapping.internal.IdClassEmbeddable; +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; @@ -30,7 +30,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; @@ -51,7 +51,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; @@ -72,7 +72,8 @@ 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 jdbcArrayClass = Array.newInstance( jdbcMapping.getJdbcJavaType().getJavaTypeClass(), 0 ) .getClass(); keyDomainType = getKeyType( keyDescriptor.getKeyPart() ); @@ -80,14 +81,22 @@ public CollectionBatchLoaderArrayParam( final BasicType arrayBasicType = getSessionFactory().getTypeConfiguration() .getBasicTypeRegistry() .getRegisteredType( jdbcArrayClass ); - arrayJdbcMapping = MultiKeyLoadHelper.resolveArrayJdbcMapping( - arrayBasicType, - jdbcMapping, - jdbcArrayClass, - getSessionFactory() + + arraySqlTypedMapping = new SqlTypedMappingImpl( + selectable.getColumnDefinition(), + selectable.getLength(), + selectable.getPrecision(), + selectable.getScale(), + selectable.getTemporalPrecision(), + MultiKeyLoadHelper.resolveArrayJdbcMapping( + arrayBasicType, + jdbcMapping, + jdbcArrayClass, + getSessionFactory() + ) ); - jdbcParameter = new JdbcParameterImpl( arrayJdbcMapping ); + jdbcParameter = new SqlTypedMappingJdbcParameter( arraySqlTypedMapping ); sqlSelect = LoaderSelectBuilder.createSelectBySingleArrayParameter( getLoadable(), keyDescriptor.getKeyPart(), @@ -191,7 +200,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/CompoundNaturalIdLoader.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CompoundNaturalIdLoader.java index 442b21f4f4f4..13173f8dd476 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CompoundNaturalIdLoader.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CompoundNaturalIdLoader.java @@ -25,6 +25,7 @@ import org.hibernate.sql.ast.tree.predicate.Predicate; 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.JdbcParameterBinding; /** @@ -83,7 +84,7 @@ protected void applyNaturalIdRestriction( 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, 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 66843671169a..c429229b242b 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 @@ -35,6 +35,7 @@ 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; @@ -112,7 +113,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 5ffff9fd24d7..22cc1c70b210 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 @@ -12,17 +12,19 @@ import org.hibernate.LockOptions; import org.hibernate.engine.spi.LoadQueryInfluencers; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; 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.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 private final int domainBatchSize; private final LoadQueryInfluencers loadQueryInfluencers; - 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; @@ -77,17 +79,26 @@ public EntityBatchLoaderArrayParam( ); } - identifierMapping = (BasicEntityIdentifierMapping) getLoadable().getIdentifierMapping(); - final Class arrayClass = - Array.newInstance( identifierMapping.getJavaType().getJavaTypeClass(), 0 ).getClass(); - arrayJdbcMapping = MultiKeyLoadHelper.resolveArrayJdbcMapping( - sessionFactory.getTypeConfiguration().getBasicTypeRegistry().getRegisteredType( arrayClass ), - identifierMapping.getJdbcMapping(), - arrayClass, - sessionFactory + identifierMapping = getLoadable().getIdentifierMapping(); + final SelectableMapping selectable = identifierMapping.getSelectable( 0 ); + final JdbcMapping jdbcMapping = selectable.getJdbcMapping(); + final Class jdbcArrayClass = Array.newInstance( jdbcMapping.getJdbcJavaType().getJavaTypeClass(), 0 ) + .getClass(); + arraySqlTypedMapping = new SqlTypedMappingImpl( + selectable.getColumnDefinition(), + selectable.getLength(), + selectable.getPrecision(), + selectable.getScale(), + selectable.getTemporalPrecision(), + MultiKeyLoadHelper.resolveArrayJdbcMapping( + sessionFactory.getTypeConfiguration().getBasicTypeRegistry().getRegisteredType( jdbcArrayClass ), + jdbcMapping, + jdbcArrayClass, + sessionFactory + ) ); - jdbcParameter = new JdbcParameterImpl( arrayJdbcMapping ); + jdbcParameter = new SqlTypedMappingJdbcParameter( arraySqlTypedMapping ); sqlAst = LoaderSelectBuilder.createSelectBySingleArrayParameter( getLoadable(), identifierMapping, @@ -148,7 +159,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 e25ec9a52bd5..d4d88f0ac953 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 @@ -72,6 +72,7 @@ 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; @@ -624,7 +625,7 @@ private void applyRestriction( selection ); if ( numberOfKeysToLoad == 1 ) { - final JdbcParameter jdbcParameter = new JdbcParameterImpl( selection.getJdbcMapping() ); + final JdbcParameter jdbcParameter = new SqlTypedMappingJdbcParameter( selection ); jdbcParameterConsumer.accept( jdbcParameter ); rootQuerySpec.applyPredicate( @@ -634,11 +635,9 @@ 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 ); } @@ -666,12 +665,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 c2fd880413ae..ae36e32d94a5 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 @@ -27,14 +27,18 @@ 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.sql.ast.tree.expression.JdbcParameter; 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; @@ -49,19 +53,30 @@ * @author Steve Ebersole */ public class MultiIdEntityLoaderArrayParam extends AbstractMultiIdEntityLoader implements SqlArrayMultiKeyLoader { - private final JdbcMapping arrayJdbcMapping; + private final SqlTypedMapping arraySqlTypedMapping; private final JdbcParameter jdbcParameter; public MultiIdEntityLoaderArrayParam(EntityMappingType entityDescriptor, SessionFactoryImplementor sessionFactory) { super( entityDescriptor, sessionFactory ); - final Class arrayClass = createTypedArray( 0 ).getClass(); - arrayJdbcMapping = MultiKeyLoadHelper.resolveArrayJdbcMapping( - getSessionFactory().getTypeConfiguration().getBasicTypeRegistry().getRegisteredType( arrayClass ), - getIdentifierMapping().getJdbcMapping(), - arrayClass, - getSessionFactory() + final EntityIdentifierMapping identifierMapping = entityDescriptor.getIdentifierMapping(); + final SelectableMapping selectable = identifierMapping.getSelectable( 0 ); + final JdbcMapping jdbcMapping = selectable.getJdbcMapping(); + final Class jdbcArrayClass = Array.newInstance( jdbcMapping.getJdbcJavaType().getJavaTypeClass(), 0 ) + .getClass(); + arraySqlTypedMapping = new SqlTypedMappingImpl( + selectable.getColumnDefinition(), + selectable.getLength(), + selectable.getPrecision(), + selectable.getScale(), + selectable.getTemporalPrecision(), + MultiKeyLoadHelper.resolveArrayJdbcMapping( + sessionFactory.getTypeConfiguration().getBasicTypeRegistry().getRegisteredType( jdbcArrayClass ), + jdbcMapping, + jdbcArrayClass, + sessionFactory + ) ); - jdbcParameter = new JdbcParameterImpl( arrayJdbcMapping ); + jdbcParameter = new SqlTypedMappingJdbcParameter( arraySqlTypedMapping ); } @Override @@ -177,7 +192,10 @@ protected List performOrderedMultiLoad(K[] ids, MultiIdLoadOptions loadOp final JdbcParameterBindings jdbcParameterBindings = new JdbcParameterBindingsImpl(1); jdbcParameterBindings.addBinding( jdbcParameter, - new JdbcParameterBindingImpl( arrayJdbcMapping, idsToLoadFromDatabase.toArray( createTypedArray(0 ) ) ) + new JdbcParameterBindingImpl( + arraySqlTypedMapping.getJdbcMapping(), + idsToLoadFromDatabase.toArray( createTypedArray( 0 ) ) + ) ); final PersistenceContext persistenceContext = session.getPersistenceContext(); @@ -274,7 +292,7 @@ protected List performUnorderedMultiLoad( sqlAst, jdbcSelectOperation, jdbcParameter, - arrayJdbcMapping, + arraySqlTypedMapping.getJdbcMapping(), null, null, null, @@ -395,6 +413,12 @@ protected final K[] processResolvableEntities( private X[] createTypedArray(@SuppressWarnings("SameParameterValue") int length) { //noinspection unchecked - return (X[]) Array.newInstance( getIdentifierMapping().getJavaType().getJavaTypeClass(), length ); + return (X[]) Array.newInstance( + getIdentifierMapping().getSelectable( 0 ) + .getJdbcMapping() + .getJdbcJavaType() + .getJavaTypeClass(), + length + ); } } 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 17116a311ce7..af8990c9299b 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 @@ -6,6 +6,7 @@ */ package org.hibernate.loader.ast.internal; +import java.lang.reflect.Array; import java.util.Collections; import java.util.List; @@ -18,16 +19,17 @@ 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.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; -import org.hibernate.type.BasicType; -import org.hibernate.type.BasicTypeRegistry; /** * Standard MultiNaturalIdLoader implementation @@ -79,15 +81,25 @@ public List multiLoad(K[] naturalIds, MultiNaturalIdLoadOptions loadOptio ? new LockOptions( LockMode.NONE ) : loadOptions.getLockOptions(); - final BasicTypeRegistry basicTypeRegistry = sessionFactory.getTypeConfiguration().getBasicTypeRegistry(); - final BasicType arrayBasicType = basicTypeRegistry.getRegisteredType( keyArrayClass ); - final JdbcMapping arrayJdbcMapping = MultiKeyLoadHelper.resolveArrayJdbcMapping( - arrayBasicType, - getNaturalIdMapping().getSingleJdbcMapping(), - keyArrayClass, - sessionFactory + final SelectableMapping selectable = getNaturalIdAttribute().getSelectable( 0 ); + final JdbcMapping jdbcMapping = selectable.getJdbcMapping(); + final Class jdbcArrayClass = Array.newInstance( jdbcMapping.getJdbcJavaType().getJavaTypeClass(), 0 ) + .getClass(); + + final SqlTypedMapping arraySqlTypedMapping = new SqlTypedMappingImpl( + selectable.getColumnDefinition(), + selectable.getLength(), + selectable.getPrecision(), + selectable.getScale(), + selectable.getTemporalPrecision(), + MultiKeyLoadHelper.resolveArrayJdbcMapping( + sessionFactory.getTypeConfiguration().getBasicTypeRegistry().getRegisteredType( jdbcArrayClass ), + jdbcMapping, + jdbcArrayClass, + sessionFactory + ) ); - final JdbcParameter jdbcParameter = new JdbcParameterImpl( arrayJdbcMapping ); + final JdbcParameter jdbcParameter = new SqlTypedMappingJdbcParameter( arraySqlTypedMapping ); final SelectStatement sqlAst = LoaderSelectBuilder.createSelectBySingleArrayParameter( getLoadable(), @@ -108,7 +120,7 @@ public List multiLoad(K[] naturalIds, MultiNaturalIdLoadOptions loadOptio sqlAst, jdbcSelectOperation, jdbcParameter, - arrayJdbcMapping, + arraySqlTypedMapping.getJdbcMapping(), null, null, null, diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SimpleNaturalIdLoader.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SimpleNaturalIdLoader.java index 9b77932d4e16..e1bca8b7a7e6 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SimpleNaturalIdLoader.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SimpleNaturalIdLoader.java @@ -21,6 +21,7 @@ import org.hibernate.sql.ast.tree.predicate.Predicate; 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.JdbcParameterBinding; /** @@ -74,7 +75,7 @@ protected void applyNaturalIdRestriction( 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, 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 4aac6f499231..dadbc9764fab 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 @@ -121,13 +121,6 @@ public CteInsertStrategy( ); } - if ( !dialect.supportsValuesList() ) { - throw new UnsupportedOperationException( - getClass().getSimpleName() + - " can only be used with Dialects that support VALUES lists" - ); - } - // The table name might be a sub-query, which is inappropriate for a temporary table name final String originalTableName = rootDescriptor.getEntityPersister().getSynchronizedQuerySpaces()[0]; final String name; 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 9f2a73270d87..2bc95e42297e 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 @@ -78,13 +78,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, rootDescriptor ); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/InsertExecutionDelegate.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/InsertExecutionDelegate.java index 67ba56a0d2d8..62b101d2dc4f 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/InsertExecutionDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/InsertExecutionDelegate.java @@ -72,13 +72,12 @@ 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; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.results.graph.basic.BasicFetch; -import org.hibernate.sql.results.graph.basic.BasicResultAssembler; import org.hibernate.sql.results.internal.SqlSelectionImpl; import org.hibernate.sql.results.spi.ListResultsConsumer; import org.hibernate.type.descriptor.ValueBinder; @@ -430,7 +429,7 @@ private int insertRootTable( new ComparisonPredicate( columnReference, ComparisonOperator.EQUAL, - new JdbcParameterImpl( identifierMapping.getJdbcMapping() ) + new SqlTypedMappingJdbcParameter( identifierMapping ) ) ); } @@ -444,8 +443,8 @@ private int insertRootTable( .noneMatch( c -> keyColumns[0].equals( c.getColumnExpression() ) ) ) { final BasicEntityIdentifierMapping identifierMapping = (BasicEntityIdentifierMapping) entityDescriptor.getIdentifierMapping(); - final JdbcParameter rowNumber = new JdbcParameterImpl( identifierMapping.getJdbcMapping() ); - final JdbcParameter rootIdentity = new JdbcParameterImpl( identifierMapping.getJdbcMapping() ); + final JdbcParameter rowNumber = new SqlTypedMappingJdbcParameter( identifierMapping ); + final JdbcParameter rootIdentity = new SqlTypedMappingJdbcParameter( identifierMapping ); final List temporaryTableAssignments = new ArrayList<>( 1 ); final ColumnReference idColumnReference = new ColumnReference( (String) null, identifierMapping ); temporaryTableAssignments.add( new Assignment( idColumnReference, rootIdentity ) ); @@ -594,8 +593,8 @@ public Object getEntity() { entry.setValue( rootIdentity ); } - 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/TableBasedInsertHandler.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/temptable/TableBasedInsertHandler.java index 1be8d2c3d1dd..bb3ff53cf6d9 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 @@ -7,9 +7,6 @@ package org.hibernate.query.sqm.mutation.internal.temptable; import java.util.ArrayList; -import java.util.Collections; -import java.util.IdentityHashMap; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.function.BiConsumer; @@ -24,7 +21,6 @@ import org.hibernate.id.OptimizableGenerator; import org.hibernate.id.enhanced.Optimizer; import org.hibernate.internal.util.collections.CollectionHelper; -import org.hibernate.metamodel.mapping.MappingModelExpressible; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.query.spi.DomainQueryExecutionContext; import org.hibernate.query.sqm.internal.DomainParameterXref; @@ -33,7 +29,6 @@ import org.hibernate.query.sqm.mutation.internal.MultiTableSqmMutationConverter; import org.hibernate.query.sqm.mutation.internal.SqmInsertStrategyHelper; import org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter; -import org.hibernate.query.sqm.tree.expression.SqmParameter; import org.hibernate.query.sqm.tree.insert.SqmInsertSelectStatement; import org.hibernate.query.sqm.tree.insert.SqmInsertStatement; import org.hibernate.query.sqm.tree.insert.SqmInsertValuesStatement; @@ -51,7 +46,7 @@ import org.hibernate.sql.ast.tree.insert.Values; import org.hibernate.sql.ast.tree.select.QueryPart; import org.hibernate.sql.ast.tree.update.Assignment; -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.results.internal.SqlSelectionImpl; import org.hibernate.type.BasicType; @@ -96,7 +91,7 @@ public TableBasedInsertHandler( this.sessionUidParameter = null; } else { - this.sessionUidParameter = new JdbcParameterImpl( sessionUidColumn.getJdbcMapping() ); + this.sessionUidParameter = new SqlTypedMappingJdbcParameter( sessionUidColumn ); } } 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 7d93f94cd67f..4fdc8850aa48 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 @@ -5889,45 +5889,13 @@ 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 ) { - continue; - } - 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 );