HHH-16679 Avoid type pollution problems on iterations of List<JdbcParameter>

This commit is contained in:
Sanne Grinovero 2023-05-20 21:29:38 +01:00 committed by Sanne Grinovero
parent f54ff9de3e
commit bf82d53516
27 changed files with 387 additions and 95 deletions

View File

@ -18,6 +18,7 @@ import org.hibernate.sql.ast.tree.from.TableGroup;
import org.hibernate.sql.ast.tree.select.QuerySpec; import org.hibernate.sql.ast.tree.select.QuerySpec;
import org.hibernate.sql.ast.tree.select.SelectStatement; import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.results.graph.DomainResult; import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.graph.entity.LoadingEntityEntry; import org.hibernate.sql.results.graph.entity.LoadingEntityEntry;
import org.hibernate.sql.results.graph.entity.internal.EntityResultInitializer; import org.hibernate.sql.results.graph.entity.internal.EntityResultInitializer;
@ -30,14 +31,14 @@ import org.hibernate.sql.results.graph.entity.internal.EntityResultInitializer;
public class SubselectFetch { public class SubselectFetch {
private final QuerySpec loadingSqlAst; private final QuerySpec loadingSqlAst;
private final TableGroup ownerTableGroup; private final TableGroup ownerTableGroup;
private final List<JdbcParameter> loadingJdbcParameters; private final JdbcParametersList loadingJdbcParameters;
private final JdbcParameterBindings loadingJdbcParameterBindings; private final JdbcParameterBindings loadingJdbcParameterBindings;
private final Set<EntityKey> resultingEntityKeys; private final Set<EntityKey> resultingEntityKeys;
public SubselectFetch( public SubselectFetch(
QuerySpec loadingSqlAst, QuerySpec loadingSqlAst,
TableGroup ownerTableGroup, TableGroup ownerTableGroup,
List<JdbcParameter> loadingJdbcParameters, JdbcParametersList loadingJdbcParameters,
JdbcParameterBindings loadingJdbcParameterBindings, JdbcParameterBindings loadingJdbcParameterBindings,
Set<EntityKey> resultingEntityKeys) { Set<EntityKey> resultingEntityKeys) {
this.loadingSqlAst = loadingSqlAst; this.loadingSqlAst = loadingSqlAst;
@ -47,7 +48,7 @@ public class SubselectFetch {
this.resultingEntityKeys = resultingEntityKeys; this.resultingEntityKeys = resultingEntityKeys;
} }
public List<JdbcParameter> getLoadingJdbcParameters() { public JdbcParametersList getLoadingJdbcParameters() {
// todo (6.0) : do not believe this is needed // todo (6.0) : do not believe this is needed
// - see org.hibernate.loader.ast.internal.LoaderSelectBuilder.generateSelect(org.hibernate.engine.spi.SubselectFetch) // - see org.hibernate.loader.ast.internal.LoaderSelectBuilder.generateSelect(org.hibernate.engine.spi.SubselectFetch)
return loadingJdbcParameters; return loadingJdbcParameters;
@ -93,7 +94,7 @@ public class SubselectFetch {
BatchFetchQueue batchFetchQueue, BatchFetchQueue batchFetchQueue,
SelectStatement sqlAst, SelectStatement sqlAst,
TableGroup tableGroup, TableGroup tableGroup,
List<JdbcParameter> jdbcParameters, JdbcParametersList jdbcParameters,
JdbcParameterBindings jdbcParameterBindings) { JdbcParameterBindings jdbcParameterBindings) {
return new StandardRegistrationHandler( return new StandardRegistrationHandler(
@ -108,7 +109,7 @@ public class SubselectFetch {
public static RegistrationHandler createRegistrationHandler( public static RegistrationHandler createRegistrationHandler(
BatchFetchQueue batchFetchQueue, BatchFetchQueue batchFetchQueue,
SelectStatement sqlAst, SelectStatement sqlAst,
List<JdbcParameter> jdbcParameters, JdbcParametersList jdbcParameters,
JdbcParameterBindings jdbcParameterBindings) { JdbcParameterBindings jdbcParameterBindings) {
final List<TableGroup> roots = sqlAst.getQuerySpec().getFromClause().getRoots(); final List<TableGroup> roots = sqlAst.getQuerySpec().getFromClause().getRoots();
if ( roots.isEmpty() ) { if ( roots.isEmpty() ) {
@ -132,7 +133,7 @@ public class SubselectFetch {
public static class StandardRegistrationHandler implements RegistrationHandler { public static class StandardRegistrationHandler implements RegistrationHandler {
private final BatchFetchQueue batchFetchQueue; private final BatchFetchQueue batchFetchQueue;
private final SelectStatement loadingSqlAst; private final SelectStatement loadingSqlAst;
private final List<JdbcParameter> loadingJdbcParameters; private final JdbcParametersList loadingJdbcParameters;
private final JdbcParameterBindings loadingJdbcParameterBindings; private final JdbcParameterBindings loadingJdbcParameterBindings;
private final Map<NavigablePath, SubselectFetch> subselectFetches = new HashMap<>(); private final Map<NavigablePath, SubselectFetch> subselectFetches = new HashMap<>();
@ -140,7 +141,7 @@ public class SubselectFetch {
BatchFetchQueue batchFetchQueue, BatchFetchQueue batchFetchQueue,
SelectStatement loadingSqlAst, SelectStatement loadingSqlAst,
TableGroup ownerTableGroup, TableGroup ownerTableGroup,
List<JdbcParameter> loadingJdbcParameters, JdbcParametersList loadingJdbcParameters,
JdbcParameterBindings loadingJdbcParameterBindings) { JdbcParameterBindings loadingJdbcParameterBindings) {
this.batchFetchQueue = batchFetchQueue; this.batchFetchQueue = batchFetchQueue;
this.loadingSqlAst = loadingSqlAst; this.loadingSqlAst = loadingSqlAst;

View File

@ -49,6 +49,7 @@ import org.hibernate.sql.exec.spi.Callback;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBinding; import org.hibernate.sql.exec.spi.JdbcParameterBinding;
import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.results.graph.DomainResult; import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.graph.Fetch; import org.hibernate.sql.results.graph.Fetch;
import org.hibernate.sql.results.graph.FetchParent; import org.hibernate.sql.results.graph.FetchParent;
@ -297,7 +298,7 @@ public abstract class AbstractNaturalIdLoader<T> implements NaturalIdLoader<T> {
public Object resolveIdToNaturalId(Object id, SharedSessionContractImplementor session) { public Object resolveIdToNaturalId(Object id, SharedSessionContractImplementor session) {
final SessionFactoryImplementor sessionFactory = session.getFactory(); final SessionFactoryImplementor sessionFactory = session.getFactory();
final List<JdbcParameter> jdbcParameters = new ArrayList<>(); JdbcParametersList.Builder jdbcParametersBuilder = JdbcParametersList.newBuilder();
final SelectStatement sqlSelect = LoaderSelectBuilder.createSelect( final SelectStatement sqlSelect = LoaderSelectBuilder.createSelect(
entityDescriptor(), entityDescriptor(),
Collections.singletonList( naturalIdMapping() ), Collections.singletonList( naturalIdMapping() ),
@ -306,10 +307,12 @@ public abstract class AbstractNaturalIdLoader<T> implements NaturalIdLoader<T> {
1, 1,
session.getLoadQueryInfluencers(), session.getLoadQueryInfluencers(),
LockOptions.NONE, LockOptions.NONE,
jdbcParameters::add, jdbcParametersBuilder::add,
sessionFactory sessionFactory
); );
final JdbcParametersList jdbcParameters = jdbcParametersBuilder.build();
final JdbcServices jdbcServices = sessionFactory.getJdbcServices(); final JdbcServices jdbcServices = sessionFactory.getJdbcServices();
final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment(); final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment();
final SqlAstTranslatorFactory sqlAstTranslatorFactory = jdbcEnvironment.getSqlAstTranslatorFactory(); final SqlAstTranslatorFactory sqlAstTranslatorFactory = jdbcEnvironment.getSqlAstTranslatorFactory();

View File

@ -27,11 +27,11 @@ import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.internal.JdbcParameterImpl; import org.hibernate.sql.exec.internal.JdbcParameterImpl;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.results.internal.RowTransformerStandardImpl; import org.hibernate.sql.results.internal.RowTransformerStandardImpl;
import org.hibernate.sql.results.spi.ListResultsConsumer; import org.hibernate.sql.results.spi.ListResultsConsumer;
import org.hibernate.type.BasicType; import org.hibernate.type.BasicType;
import static java.util.Collections.singletonList;
import static org.hibernate.loader.ast.internal.MultiKeyLoadLogging.MULTI_KEY_LOAD_DEBUG_ENABLED; import static org.hibernate.loader.ast.internal.MultiKeyLoadLogging.MULTI_KEY_LOAD_DEBUG_ENABLED;
import static org.hibernate.loader.ast.internal.MultiKeyLoadLogging.MULTI_KEY_LOAD_LOGGER; import static org.hibernate.loader.ast.internal.MultiKeyLoadLogging.MULTI_KEY_LOAD_LOGGER;
@ -120,7 +120,7 @@ public class CollectionBatchLoaderArrayParam
final SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler = SubselectFetch.createRegistrationHandler( final SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler = SubselectFetch.createRegistrationHandler(
session.getPersistenceContext().getBatchFetchQueue(), session.getPersistenceContext().getBatchFetchQueue(),
sqlSelect, sqlSelect,
singletonList( jdbcParameter ), JdbcParametersList.singleton( jdbcParameter ),
jdbcParameterBindings jdbcParameterBindings
); );

View File

@ -6,9 +6,6 @@
*/ */
package org.hibernate.loader.ast.internal; package org.hibernate.loader.ast.internal;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.LockOptions; import org.hibernate.LockOptions;
import org.hibernate.engine.spi.BatchFetchQueue; import org.hibernate.engine.spi.BatchFetchQueue;
import org.hibernate.engine.spi.LoadQueryInfluencers; import org.hibernate.engine.spi.LoadQueryInfluencers;
@ -19,10 +16,10 @@ import org.hibernate.loader.ast.spi.CollectionBatchLoader;
import org.hibernate.loader.ast.spi.SqlArrayMultiKeyLoader; import org.hibernate.loader.ast.spi.SqlArrayMultiKeyLoader;
import org.hibernate.metamodel.mapping.PluralAttributeMapping; import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.query.spi.QueryOptions; 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.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import static org.hibernate.loader.ast.internal.MultiKeyLoadHelper.countIds; import static org.hibernate.loader.ast.internal.MultiKeyLoadHelper.countIds;
import static org.hibernate.loader.ast.internal.MultiKeyLoadLogging.MULTI_KEY_LOAD_DEBUG_ENABLED; import static org.hibernate.loader.ast.internal.MultiKeyLoadLogging.MULTI_KEY_LOAD_DEBUG_ENABLED;
@ -38,7 +35,7 @@ public class CollectionBatchLoaderInPredicate
implements SqlArrayMultiKeyLoader { implements SqlArrayMultiKeyLoader {
private final int keyColumnCount; private final int keyColumnCount;
private final int sqlBatchSize; private final int sqlBatchSize;
private final List<JdbcParameter> jdbcParameters; private final JdbcParametersList jdbcParameters;
private final SelectStatement sqlAst; private final SelectStatement sqlAst;
private final JdbcOperationQuerySelect jdbcSelect; private final JdbcOperationQuerySelect jdbcSelect;
@ -63,8 +60,8 @@ public class CollectionBatchLoaderInPredicate
); );
} }
jdbcParameters = new ArrayList<>(); final JdbcParametersList.Builder jdbcParametersBuilder = JdbcParametersList.newBuilder();
sqlAst = LoaderSelectBuilder.createSelect( this.sqlAst = LoaderSelectBuilder.createSelect(
attributeMapping, attributeMapping,
null, null,
attributeMapping.getKeyDescriptor(), attributeMapping.getKeyDescriptor(),
@ -72,10 +69,11 @@ public class CollectionBatchLoaderInPredicate
sqlBatchSize, sqlBatchSize,
influencers, influencers,
LockOptions.NONE, LockOptions.NONE,
jdbcParameters::add, jdbcParametersBuilder::add,
sessionFactory sessionFactory
); );
assert jdbcParameters.size() == sqlBatchSize * keyColumnCount; this.jdbcParameters = jdbcParametersBuilder.build();
assert this.jdbcParameters.size() == this.sqlBatchSize * this.keyColumnCount;
jdbcSelect = sessionFactory.getJdbcServices() jdbcSelect = sessionFactory.getJdbcServices()
.getJdbcEnvironment() .getJdbcEnvironment()

View File

@ -24,12 +24,12 @@ import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.metamodel.mapping.internal.EntityCollectionPart; import org.hibernate.metamodel.mapping.internal.EntityCollectionPart;
import org.hibernate.query.spi.QueryOptions; import org.hibernate.query.spi.QueryOptions;
import org.hibernate.sql.ast.SqlAstTranslatorFactory; import org.hibernate.sql.ast.SqlAstTranslatorFactory;
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
import org.hibernate.sql.ast.tree.select.SelectStatement; import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.internal.BaseExecutionContext; import org.hibernate.sql.exec.internal.BaseExecutionContext;
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.results.internal.RowTransformerStandardImpl; import org.hibernate.sql.results.internal.RowTransformerStandardImpl;
import org.hibernate.sql.results.spi.ListResultsConsumer; import org.hibernate.sql.results.spi.ListResultsConsumer;
@ -39,7 +39,7 @@ import org.hibernate.sql.results.spi.ListResultsConsumer;
public class CollectionElementLoaderByIndex implements Loader { public class CollectionElementLoaderByIndex implements Loader {
private final PluralAttributeMapping attributeMapping; private final PluralAttributeMapping attributeMapping;
private final SelectStatement sqlAst; private final SelectStatement sqlAst;
private final List<JdbcParameter> jdbcParameters; private final JdbcParametersList jdbcParameters;
private final int baseIndex; private final int baseIndex;
private final int keyJdbcCount; private final int keyJdbcCount;
@ -88,7 +88,7 @@ public class CollectionElementLoaderByIndex implements Loader {
List<ModelPart> partsToSelect = new ArrayList<>(); List<ModelPart> partsToSelect = new ArrayList<>();
partsToSelect.add( attributeMapping.getElementDescriptor() ); partsToSelect.add( attributeMapping.getElementDescriptor() );
this.jdbcParameters = new ArrayList<>( keyJdbcCount ); final JdbcParametersList.Builder jdbcParametersBuilder = JdbcParametersList.newBuilder( keyJdbcCount );
this.sqlAst = LoaderSelectBuilder.createSelect( this.sqlAst = LoaderSelectBuilder.createSelect(
attributeMapping, attributeMapping,
partsToSelect, partsToSelect,
@ -97,9 +97,10 @@ public class CollectionElementLoaderByIndex implements Loader {
1, 1,
influencers, influencers,
LockOptions.NONE, LockOptions.NONE,
jdbcParameters::add, jdbcParametersBuilder::add,
sessionFactory sessionFactory
); );
this.jdbcParameters = jdbcParametersBuilder.build();
} }
@Override @Override
@ -115,7 +116,7 @@ public class CollectionElementLoaderByIndex implements Loader {
return sqlAst; return sqlAst;
} }
public List<JdbcParameter> getJdbcParameters() { public JdbcParametersList getJdbcParameters() {
return jdbcParameters; return jdbcParameters;
} }

View File

@ -6,9 +6,6 @@
*/ */
package org.hibernate.loader.ast.internal; package org.hibernate.loader.ast.internal;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.LockOptions; import org.hibernate.LockOptions;
import org.hibernate.collection.spi.PersistentCollection; import org.hibernate.collection.spi.PersistentCollection;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
@ -23,12 +20,12 @@ import org.hibernate.loader.ast.spi.CollectionLoader;
import org.hibernate.metamodel.mapping.PluralAttributeMapping; import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.query.spi.QueryOptions; import org.hibernate.query.spi.QueryOptions;
import org.hibernate.sql.ast.SqlAstTranslatorFactory; import org.hibernate.sql.ast.SqlAstTranslatorFactory;
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
import org.hibernate.sql.ast.tree.select.SelectStatement; import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.internal.BaseExecutionContext; import org.hibernate.sql.exec.internal.BaseExecutionContext;
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.results.graph.entity.LoadingEntityEntry; import org.hibernate.sql.results.graph.entity.LoadingEntityEntry;
import org.hibernate.sql.results.internal.RowTransformerStandardImpl; import org.hibernate.sql.results.internal.RowTransformerStandardImpl;
import org.hibernate.sql.results.spi.ListResultsConsumer; import org.hibernate.sql.results.spi.ListResultsConsumer;
@ -44,7 +41,7 @@ public class CollectionLoaderSingleKey implements CollectionLoader {
private final int keyJdbcCount; private final int keyJdbcCount;
private final SelectStatement sqlAst; private final SelectStatement sqlAst;
private final List<JdbcParameter> jdbcParameters; private final JdbcParametersList jdbcParameters;
public CollectionLoaderSingleKey( public CollectionLoaderSingleKey(
PluralAttributeMapping attributeMapping, PluralAttributeMapping attributeMapping,
@ -53,8 +50,8 @@ public class CollectionLoaderSingleKey implements CollectionLoader {
this.attributeMapping = attributeMapping; this.attributeMapping = attributeMapping;
this.keyJdbcCount = attributeMapping.getKeyDescriptor().getJdbcTypeCount(); this.keyJdbcCount = attributeMapping.getKeyDescriptor().getJdbcTypeCount();
final JdbcParametersList.Builder jdbcParametersBuilder = JdbcParametersList.newBuilder();
this.jdbcParameters = new ArrayList<>();
this.sqlAst = LoaderSelectBuilder.createSelect( this.sqlAst = LoaderSelectBuilder.createSelect(
attributeMapping, attributeMapping,
null, null,
@ -63,9 +60,10 @@ public class CollectionLoaderSingleKey implements CollectionLoader {
1, 1,
influencers, influencers,
LockOptions.NONE, LockOptions.NONE,
jdbcParameters::add, jdbcParametersBuilder::add,
sessionFactory sessionFactory
); );
this.jdbcParameters = jdbcParametersBuilder.build();
} }
@Override @Override
@ -81,7 +79,7 @@ public class CollectionLoaderSingleKey implements CollectionLoader {
return sqlAst; return sqlAst;
} }
public List<JdbcParameter> getJdbcParameters() { public JdbcParametersList getJdbcParameters() {
return jdbcParameters; return jdbcParameters;
} }

View File

@ -37,6 +37,7 @@ import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.internal.JdbcParameterImpl; import org.hibernate.sql.exec.internal.JdbcParameterImpl;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.results.graph.DomainResult; import org.hibernate.sql.results.graph.DomainResult;
import org.hibernate.sql.results.graph.internal.ImmutableFetchList; import org.hibernate.sql.results.graph.internal.ImmutableFetchList;
import org.hibernate.sql.results.internal.RowTransformerDatabaseSnapshotImpl; import org.hibernate.sql.results.internal.RowTransformerDatabaseSnapshotImpl;
@ -55,16 +56,14 @@ class DatabaseSnapshotExecutor {
private final EntityMappingType entityDescriptor; private final EntityMappingType entityDescriptor;
private final JdbcOperationQuerySelect jdbcSelect; private final JdbcOperationQuerySelect jdbcSelect;
private final List<JdbcParameter> jdbcParameters; private final JdbcParametersList jdbcParameters;
DatabaseSnapshotExecutor( DatabaseSnapshotExecutor(
EntityMappingType entityDescriptor, EntityMappingType entityDescriptor,
SessionFactoryImplementor sessionFactory) { SessionFactoryImplementor sessionFactory) {
this.entityDescriptor = entityDescriptor; this.entityDescriptor = entityDescriptor;
this.jdbcParameters = new ArrayList<>( JdbcParametersList.Builder jdbcParametersBuilder = JdbcParametersList.newBuilder(
entityDescriptor.getIdentifierMapping().getJdbcTypeCount() entityDescriptor.getIdentifierMapping().getJdbcTypeCount() );
);
final QuerySpec rootQuerySpec = new QuerySpec( true ); final QuerySpec rootQuerySpec = new QuerySpec( true );
final SqlAliasBaseManager sqlAliasBaseManager = new SqlAliasBaseManager(); final SqlAliasBaseManager sqlAliasBaseManager = new SqlAliasBaseManager();
@ -114,7 +113,7 @@ class DatabaseSnapshotExecutor {
); );
final JdbcParameter jdbcParameter = new JdbcParameterImpl( selection.getJdbcMapping() ); final JdbcParameter jdbcParameter = new JdbcParameterImpl( selection.getJdbcMapping() );
jdbcParameters.add( jdbcParameter ); jdbcParametersBuilder.add( jdbcParameter );
final ColumnReference columnReference = (ColumnReference) sqlExpressionResolver final ColumnReference columnReference = (ColumnReference) sqlExpressionResolver
.resolveSqlExpression( tableReference, selection ); .resolveSqlExpression( tableReference, selection );
@ -128,6 +127,7 @@ class DatabaseSnapshotExecutor {
); );
} }
); );
this.jdbcParameters = jdbcParametersBuilder.build();
entityDescriptor.forEachAttributeMapping( entityDescriptor.forEachAttributeMapping(

View File

@ -22,10 +22,10 @@ import org.hibernate.loader.ast.spi.SqlInPredicateMultiKeyLoader;
import org.hibernate.metamodel.mapping.EntityIdentifierMapping; import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.mapping.EntityMappingType;
import org.hibernate.query.spi.QueryOptions; 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.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import static org.hibernate.internal.util.collections.CollectionHelper.arrayList; import static org.hibernate.internal.util.collections.CollectionHelper.arrayList;
import static org.hibernate.loader.ast.internal.MultiKeyLoadLogging.MULTI_KEY_LOAD_DEBUG_ENABLED; import static org.hibernate.loader.ast.internal.MultiKeyLoadLogging.MULTI_KEY_LOAD_DEBUG_ENABLED;
@ -47,7 +47,7 @@ public class EntityBatchLoaderInPredicate<T>
private final int domainBatchSize; private final int domainBatchSize;
private final int sqlBatchSize; private final int sqlBatchSize;
private final List<JdbcParameter> jdbcParameters; private final JdbcParametersList jdbcParameters;
private final SelectStatement sqlAst; private final SelectStatement sqlAst;
private final JdbcOperationQuerySelect jdbcSelectOperation; private final JdbcOperationQuerySelect jdbcSelectOperation;
@ -79,7 +79,7 @@ public class EntityBatchLoaderInPredicate<T>
final int expectedNumberOfParameters = identifierMapping.getJdbcTypeCount() * sqlBatchSize; final int expectedNumberOfParameters = identifierMapping.getJdbcTypeCount() * sqlBatchSize;
jdbcParameters = arrayList( expectedNumberOfParameters ); final JdbcParametersList.Builder jdbcParametersBuilder = JdbcParametersList.newBuilder( expectedNumberOfParameters );
sqlAst = LoaderSelectBuilder.createSelect( sqlAst = LoaderSelectBuilder.createSelect(
getLoadable(), getLoadable(),
// null here means to select everything // null here means to select everything
@ -89,9 +89,10 @@ public class EntityBatchLoaderInPredicate<T>
sqlBatchSize, sqlBatchSize,
new LoadQueryInfluencers( sessionFactory ), new LoadQueryInfluencers( sessionFactory ),
LockOptions.NONE, LockOptions.NONE,
jdbcParameters::add, jdbcParametersBuilder::add,
sessionFactory sessionFactory
); );
this.jdbcParameters = jdbcParametersBuilder.build();
assert jdbcParameters.size() == expectedNumberOfParameters; assert jdbcParameters.size() == expectedNumberOfParameters;
jdbcSelectOperation = sessionFactory.getJdbcServices() jdbcSelectOperation = sessionFactory.getJdbcServices()

View File

@ -33,6 +33,7 @@ import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl;
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.results.internal.RowTransformerStandardImpl; import org.hibernate.sql.results.internal.RowTransformerStandardImpl;
import org.hibernate.sql.results.spi.ListResultsConsumer; import org.hibernate.sql.results.spi.ListResultsConsumer;
import org.hibernate.type.descriptor.java.JavaType; import org.hibernate.type.descriptor.java.JavaType;
@ -207,7 +208,7 @@ public class LoaderHelper {
final SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler = SubselectFetch.createRegistrationHandler( final SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler = SubselectFetch.createRegistrationHandler(
session.getPersistenceContext().getBatchFetchQueue(), session.getPersistenceContext().getBatchFetchQueue(),
sqlAst, sqlAst,
Collections.singletonList( jdbcParameter ), JdbcParametersList.singleton( jdbcParameter ),
jdbcParameterBindings jdbcParameterBindings
); );

View File

@ -38,6 +38,7 @@ import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.internal.JdbcParameterImpl; import org.hibernate.sql.exec.internal.JdbcParameterImpl;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.results.internal.RowTransformerStandardImpl; import org.hibernate.sql.results.internal.RowTransformerStandardImpl;
import org.hibernate.sql.results.spi.ListResultsConsumer; import org.hibernate.sql.results.spi.ListResultsConsumer;
@ -186,7 +187,7 @@ public class MultiIdEntityLoaderArrayParam<E> extends AbstractMultiIdEntityLoade
final SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler = SubselectFetch.createRegistrationHandler( final SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler = SubselectFetch.createRegistrationHandler(
batchFetchQueue, batchFetchQueue,
sqlAst, sqlAst,
Collections.singletonList( jdbcParameter ), JdbcParametersList.singleton( jdbcParameter ),
jdbcParameterBindings jdbcParameterBindings
); );

View File

@ -35,6 +35,7 @@ import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.results.internal.RowTransformerStandardImpl; import org.hibernate.sql.results.internal.RowTransformerStandardImpl;
import org.hibernate.sql.results.spi.ListResultsConsumer; import org.hibernate.sql.results.spi.ListResultsConsumer;
@ -210,7 +211,7 @@ public class MultiIdEntityLoaderStandard<T> extends AbstractMultiIdEntityLoader<
log.tracef( "#loadEntitiesById(`%s`, `%s`, ..)", getLoadable().getEntityName(), numberOfIdsInBatch ); log.tracef( "#loadEntitiesById(`%s`, `%s`, ..)", getLoadable().getEntityName(), numberOfIdsInBatch );
} }
final List<JdbcParameter> jdbcParameters = new ArrayList<>( numberOfIdsInBatch * idJdbcTypeCount); JdbcParametersList.Builder jdbcParametersBuilder = JdbcParametersList.newBuilder( numberOfIdsInBatch * idJdbcTypeCount );
final SelectStatement sqlAst = LoaderSelectBuilder.createSelect( final SelectStatement sqlAst = LoaderSelectBuilder.createSelect(
getLoadable(), getLoadable(),
@ -221,9 +222,10 @@ public class MultiIdEntityLoaderStandard<T> extends AbstractMultiIdEntityLoader<
numberOfIdsInBatch, numberOfIdsInBatch,
session.getLoadQueryInfluencers(), session.getLoadQueryInfluencers(),
lockOptions, lockOptions,
jdbcParameters::add, jdbcParametersBuilder::add,
getSessionFactory() getSessionFactory()
); );
JdbcParametersList jdbcParameters = jdbcParametersBuilder.build();
final SqlAstTranslatorFactory sqlAstTranslatorFactory = final SqlAstTranslatorFactory sqlAstTranslatorFactory =
getSessionFactory().getJdbcServices().getJdbcEnvironment().getSqlAstTranslatorFactory(); getSessionFactory().getJdbcServices().getJdbcEnvironment().getSqlAstTranslatorFactory();

View File

@ -16,6 +16,7 @@ import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.exec.spi.ExecutionContext;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.results.internal.RowTransformerStandardImpl; import org.hibernate.sql.results.internal.RowTransformerStandardImpl;
import org.hibernate.sql.results.spi.ListResultsConsumer; import org.hibernate.sql.results.spi.ListResultsConsumer;
@ -53,7 +54,7 @@ public class MultiKeyLoadChunker<K> {
private final int keyColumnCount; private final int keyColumnCount;
private final Bindable bindable; private final Bindable bindable;
private final List<JdbcParameter> jdbcParameters; private final JdbcParametersList jdbcParameters;
private final SelectStatement sqlAst; private final SelectStatement sqlAst;
private final JdbcOperationQuerySelect jdbcSelect; private final JdbcOperationQuerySelect jdbcSelect;
@ -61,7 +62,7 @@ public class MultiKeyLoadChunker<K> {
int chunkSize, int chunkSize,
int keyColumnCount, int keyColumnCount,
Bindable bindable, Bindable bindable,
List<JdbcParameter> jdbcParameters, JdbcParametersList jdbcParameters,
SelectStatement sqlAst, SelectStatement sqlAst,
JdbcOperationQuerySelect jdbcSelect) { JdbcOperationQuerySelect jdbcSelect) {
this.chunkSize = chunkSize; this.chunkSize = chunkSize;

View File

@ -28,6 +28,7 @@ import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.results.internal.RowTransformerStandardImpl; import org.hibernate.sql.results.internal.RowTransformerStandardImpl;
import org.hibernate.sql.results.spi.ListResultsConsumer; import org.hibernate.sql.results.spi.ListResultsConsumer;
@ -51,7 +52,7 @@ public class MultiNaturalIdLoadingBatcher {
private final EntityMappingType entityDescriptor; private final EntityMappingType entityDescriptor;
private final SelectStatement sqlSelect; private final SelectStatement sqlSelect;
private final List<JdbcParameter> jdbcParameters; private final JdbcParametersList jdbcParameters;
private final KeyValueResolver keyValueResolver; private final KeyValueResolver keyValueResolver;
@ -66,8 +67,8 @@ public class MultiNaturalIdLoadingBatcher {
LockOptions lockOptions, LockOptions lockOptions,
SessionFactoryImplementor sessionFactory) { SessionFactoryImplementor sessionFactory) {
this.entityDescriptor = entityDescriptor; this.entityDescriptor = entityDescriptor;
final JdbcParametersList.Builder jdbcParametersBuilder = JdbcParametersList.newBuilder();
jdbcParameters = new ArrayList<>( batchSize );
sqlSelect = LoaderSelectBuilder.createSelect( sqlSelect = LoaderSelectBuilder.createSelect(
entityDescriptor, entityDescriptor,
// return the full entity rather than parts // return the full entity rather than parts
@ -78,9 +79,10 @@ public class MultiNaturalIdLoadingBatcher {
batchSize, batchSize,
loadQueryInfluencers, loadQueryInfluencers,
lockOptions, lockOptions,
jdbcParameters::add, jdbcParametersBuilder::add,
sessionFactory sessionFactory
); );
this.jdbcParameters = jdbcParametersBuilder.build();
this.keyValueResolver = keyValueResolver; this.keyValueResolver = keyValueResolver;

View File

@ -14,6 +14,7 @@ import org.hibernate.metamodel.mapping.EntityMappingType;
import org.hibernate.metamodel.mapping.ModelPart; import org.hibernate.metamodel.mapping.ModelPart;
import org.hibernate.sql.ast.tree.expression.JdbcParameter; import org.hibernate.sql.ast.tree.expression.JdbcParameter;
import org.hibernate.sql.ast.tree.select.SelectStatement; import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.results.internal.RowTransformerDatabaseSnapshotImpl; import org.hibernate.sql.results.internal.RowTransformerDatabaseSnapshotImpl;
import org.hibernate.sql.results.spi.RowTransformer; import org.hibernate.sql.results.spi.RowTransformer;
@ -28,7 +29,7 @@ public class SingleIdArrayLoadPlan extends SingleIdLoadPlan<Object[]> {
EntityMappingType entityMappingType, EntityMappingType entityMappingType,
ModelPart restrictivePart, ModelPart restrictivePart,
SelectStatement sqlAst, SelectStatement sqlAst,
List<JdbcParameter> jdbcParameters, JdbcParametersList jdbcParameters,
LockOptions lockOptions, LockOptions lockOptions,
SessionFactoryImplementor sessionFactory) { SessionFactoryImplementor sessionFactory) {
super( entityMappingType, restrictivePart, sqlAst, jdbcParameters, lockOptions, sessionFactory ); super( entityMappingType, restrictivePart, sqlAst, jdbcParameters, lockOptions, sessionFactory );

View File

@ -22,6 +22,7 @@ import org.hibernate.metamodel.mapping.EntityMappingType;
import org.hibernate.persister.entity.Loadable; import org.hibernate.persister.entity.Loadable;
import org.hibernate.sql.ast.tree.select.SelectStatement; import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.ast.tree.expression.JdbcParameter; import org.hibernate.sql.ast.tree.expression.JdbcParameter;
import org.hibernate.sql.exec.spi.JdbcParametersList;
/** /**
* Standard implementation of {@link org.hibernate.loader.ast.spi.SingleIdEntityLoader}. * Standard implementation of {@link org.hibernate.loader.ast.spi.SingleIdEntityLoader}.
@ -171,7 +172,7 @@ public class SingleIdEntityLoaderStandardImpl<T> extends SingleIdEntityLoaderSup
LoadQueryInfluencers queryInfluencers, LoadQueryInfluencers queryInfluencers,
SessionFactoryImplementor sessionFactory) { SessionFactoryImplementor sessionFactory) {
final List<JdbcParameter> jdbcParameters = new ArrayList<>(); final JdbcParametersList.Builder jdbcParametersBuilder = JdbcParametersList.newBuilder();
final SelectStatement sqlAst = LoaderSelectBuilder.createSelect( final SelectStatement sqlAst = LoaderSelectBuilder.createSelect(
getLoadable(), getLoadable(),
@ -182,10 +183,11 @@ public class SingleIdEntityLoaderStandardImpl<T> extends SingleIdEntityLoaderSup
1, 1,
queryInfluencers, queryInfluencers,
lockOptions, lockOptions,
jdbcParameters::add, jdbcParametersBuilder::add,
sessionFactory sessionFactory
); );
final JdbcParametersList jdbcParameters = jdbcParametersBuilder.build();
return new SingleIdLoadPlan<>( return new SingleIdLoadPlan<>(
(Loadable) getLoadable(), (Loadable) getLoadable(),
getLoadable().getIdentifierMapping(), getLoadable().getIdentifierMapping(),

View File

@ -28,6 +28,7 @@ import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.spi.Callback; import org.hibernate.sql.exec.spi.Callback;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.results.internal.RowTransformerStandardImpl; import org.hibernate.sql.results.internal.RowTransformerStandardImpl;
import org.hibernate.sql.results.spi.ListResultsConsumer; import org.hibernate.sql.results.spi.ListResultsConsumer;
import org.hibernate.sql.results.spi.RowTransformer; import org.hibernate.sql.results.spi.RowTransformer;
@ -46,13 +47,13 @@ public class SingleIdLoadPlan<T> implements SingleEntityLoadPlan {
private final ModelPart restrictivePart; private final ModelPart restrictivePart;
private final LockOptions lockOptions; private final LockOptions lockOptions;
private final JdbcOperationQuerySelect jdbcSelect; private final JdbcOperationQuerySelect jdbcSelect;
private final List<JdbcParameter> jdbcParameters; private final JdbcParametersList jdbcParameters;
public SingleIdLoadPlan( public SingleIdLoadPlan(
EntityMappingType entityMappingType, EntityMappingType entityMappingType,
ModelPart restrictivePart, ModelPart restrictivePart,
SelectStatement sqlAst, SelectStatement sqlAst,
List<JdbcParameter> jdbcParameters, JdbcParametersList jdbcParameters,
LockOptions lockOptions, LockOptions lockOptions,
SessionFactoryImplementor sessionFactory) { SessionFactoryImplementor sessionFactory) {
this.entityMappingType = entityMappingType; this.entityMappingType = entityMappingType;
@ -78,7 +79,7 @@ public class SingleIdLoadPlan<T> implements SingleEntityLoadPlan {
return lockOptions; return lockOptions;
} }
protected List<JdbcParameter> getJdbcParameters() { protected JdbcParametersList getJdbcParameters() {
return jdbcParameters; return jdbcParameters;
} }

View File

@ -32,6 +32,7 @@ import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.spi.Callback; import org.hibernate.sql.exec.spi.Callback;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.results.spi.ListResultsConsumer; import org.hibernate.sql.results.spi.ListResultsConsumer;
import static java.util.Collections.singletonList; import static java.util.Collections.singletonList;
@ -69,7 +70,7 @@ public class SingleUniqueKeyEntityLoaderStandard<T> implements SingleUniqueKeyEn
final SessionFactoryImplementor sessionFactory = session.getFactory(); final SessionFactoryImplementor sessionFactory = session.getFactory();
// todo (6.0) : cache the SQL AST and JdbcParameters // todo (6.0) : cache the SQL AST and JdbcParameters
final List<JdbcParameter> jdbcParameters = new ArrayList<>(); JdbcParametersList.Builder builder = JdbcParametersList.newBuilder();
final SelectStatement sqlAst = LoaderSelectBuilder.createSelectByUniqueKey( final SelectStatement sqlAst = LoaderSelectBuilder.createSelectByUniqueKey(
entityDescriptor, entityDescriptor,
Collections.emptyList(), Collections.emptyList(),
@ -77,13 +78,14 @@ public class SingleUniqueKeyEntityLoaderStandard<T> implements SingleUniqueKeyEn
null, null,
new LoadQueryInfluencers( sessionFactory ), new LoadQueryInfluencers( sessionFactory ),
LockOptions.NONE, LockOptions.NONE,
jdbcParameters::add, builder::add,
sessionFactory sessionFactory
); );
final JdbcServices jdbcServices = sessionFactory.getJdbcServices(); final JdbcServices jdbcServices = sessionFactory.getJdbcServices();
final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment(); final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment();
final SqlAstTranslatorFactory sqlAstTranslatorFactory = jdbcEnvironment.getSqlAstTranslatorFactory(); final SqlAstTranslatorFactory sqlAstTranslatorFactory = jdbcEnvironment.getSqlAstTranslatorFactory();
JdbcParametersList jdbcParameters = builder.build();
final JdbcParameterBindings jdbcParameterBindings = new JdbcParameterBindingsImpl( jdbcParameters.size() ); final JdbcParameterBindings jdbcParameterBindings = new JdbcParameterBindingsImpl( jdbcParameters.size() );
int offset = jdbcParameterBindings.registerParametersForEachJdbcValue( int offset = jdbcParameterBindings.registerParametersForEachJdbcValue(
@ -124,7 +126,7 @@ public class SingleUniqueKeyEntityLoaderStandard<T> implements SingleUniqueKeyEn
final SessionFactoryImplementor sessionFactory = session.getFactory(); final SessionFactoryImplementor sessionFactory = session.getFactory();
// todo (6.0) : cache the SQL AST and JdbcParameters // todo (6.0) : cache the SQL AST and JdbcParameters
final List<JdbcParameter> jdbcParameters = new ArrayList<>(); final JdbcParametersList.Builder jdbcParametersBuilder = JdbcParametersList.newBuilder();
final SelectStatement sqlAst = LoaderSelectBuilder.createSelectByUniqueKey( final SelectStatement sqlAst = LoaderSelectBuilder.createSelectByUniqueKey(
entityDescriptor, entityDescriptor,
singletonList( entityDescriptor.getIdentifierMapping() ), singletonList( entityDescriptor.getIdentifierMapping() ),
@ -132,14 +134,14 @@ public class SingleUniqueKeyEntityLoaderStandard<T> implements SingleUniqueKeyEn
null, null,
new LoadQueryInfluencers( sessionFactory ), new LoadQueryInfluencers( sessionFactory ),
LockOptions.NONE, LockOptions.NONE,
jdbcParameters::add, jdbcParametersBuilder::add,
sessionFactory sessionFactory
); );
final JdbcServices jdbcServices = sessionFactory.getJdbcServices(); final JdbcServices jdbcServices = sessionFactory.getJdbcServices();
final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment(); final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment();
final SqlAstTranslatorFactory sqlAstTranslatorFactory = jdbcEnvironment.getSqlAstTranslatorFactory(); final SqlAstTranslatorFactory sqlAstTranslatorFactory = jdbcEnvironment.getSqlAstTranslatorFactory();
final JdbcParametersList jdbcParameters = jdbcParametersBuilder.build();
final JdbcParameterBindings jdbcParameterBindings = new JdbcParameterBindingsImpl( jdbcParameters.size() ); final JdbcParameterBindings jdbcParameterBindings = new JdbcParameterBindingsImpl( jdbcParameters.size() );
int offset = jdbcParameterBindings.registerParametersForEachJdbcValue( int offset = jdbcParameterBindings.registerParametersForEachJdbcValue(
ukValue, ukValue,

View File

@ -27,6 +27,7 @@ import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import static org.hibernate.sql.results.spi.ListResultsConsumer.UniqueSemantic.FILTER; import static org.hibernate.sql.results.spi.ListResultsConsumer.UniqueSemantic.FILTER;
@ -46,7 +47,7 @@ import static org.hibernate.sql.results.spi.ListResultsConsumer.UniqueSemantic.F
public class GeneratedValuesProcessor { public class GeneratedValuesProcessor {
private final SelectStatement selectStatement; private final SelectStatement selectStatement;
private final List<AttributeMapping> generatedValuesToSelect; private final List<AttributeMapping> generatedValuesToSelect;
private final List<JdbcParameter> jdbcParameters = new ArrayList<>(); private final JdbcParametersList jdbcParameters;
private final EntityMappingType entityDescriptor; private final EntityMappingType entityDescriptor;
private final SessionFactoryImplementor sessionFactory; private final SessionFactoryImplementor sessionFactory;
@ -61,8 +62,11 @@ public class GeneratedValuesProcessor {
generatedValuesToSelect = getGeneratedAttributes( entityDescriptor, timing ); generatedValuesToSelect = getGeneratedAttributes( entityDescriptor, timing );
if ( generatedValuesToSelect.isEmpty() ) { if ( generatedValuesToSelect.isEmpty() ) {
selectStatement = null; selectStatement = null;
this.jdbcParameters = JdbcParametersList.empty();
} }
else { else {
JdbcParametersList.Builder builder = JdbcParametersList.newBuilder();
selectStatement = LoaderSelectBuilder.createSelect( selectStatement = LoaderSelectBuilder.createSelect(
entityDescriptor, entityDescriptor,
generatedValuesToSelect, generatedValuesToSelect,
@ -71,9 +75,10 @@ public class GeneratedValuesProcessor {
1, 1,
new LoadQueryInfluencers( sessionFactory ), new LoadQueryInfluencers( sessionFactory ),
LockOptions.READ, LockOptions.READ,
jdbcParameters::add, builder::add,
sessionFactory sessionFactory
); );
this.jdbcParameters = builder.build();
} }
} }
@ -148,7 +153,7 @@ public class GeneratedValuesProcessor {
return generatedValuesToSelect; return generatedValuesToSelect;
} }
public List<JdbcParameter> getJdbcParameters() { public JdbcParametersList getJdbcParameters() {
return jdbcParameters; return jdbcParameters;
} }

View File

@ -251,6 +251,7 @@ import org.hibernate.sql.ast.tree.select.QuerySpec;
import org.hibernate.sql.ast.tree.select.SelectClause; import org.hibernate.sql.ast.tree.select.SelectClause;
import org.hibernate.sql.ast.tree.select.SelectStatement; import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.spi.JdbcOperation; import org.hibernate.sql.exec.spi.JdbcOperation;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.model.MutationOperationGroup; import org.hibernate.sql.model.MutationOperationGroup;
import org.hibernate.sql.model.ast.builder.MutationGroupBuilder; import org.hibernate.sql.model.ast.builder.MutationGroupBuilder;
import org.hibernate.sql.results.graph.DomainResult; import org.hibernate.sql.results.graph.DomainResult;
@ -1180,7 +1181,7 @@ public abstract class AbstractEntityPersister
return null; return null;
} }
else { else {
final List<JdbcParameter> jdbcParameters = new ArrayList<>(); JdbcParametersList.Builder jdbcParametersBuilder = JdbcParametersList.newBuilder();
final SelectStatement select = LoaderSelectBuilder.createSelect( final SelectStatement select = LoaderSelectBuilder.createSelect(
this, this,
partsToSelect, partsToSelect,
@ -1189,9 +1190,10 @@ public abstract class AbstractEntityPersister
1, 1,
new LoadQueryInfluencers( factory ), new LoadQueryInfluencers( factory ),
LockOptions.NONE, LockOptions.NONE,
jdbcParameters::add, jdbcParametersBuilder::add,
factory factory
); );
JdbcParametersList jdbcParameters = jdbcParametersBuilder.build();
return new SingleIdArrayLoadPlan( return new SingleIdArrayLoadPlan(
this, this,
getIdentifierMapping(), getIdentifierMapping(),

View File

@ -45,6 +45,7 @@ import org.hibernate.sql.ast.tree.expression.JdbcParameter;
import org.hibernate.sql.ast.tree.select.SelectStatement; import org.hibernate.sql.ast.tree.select.SelectStatement;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.exec.spi.JdbcSelectExecutor; import org.hibernate.sql.exec.spi.JdbcSelectExecutor;
import org.hibernate.sql.results.graph.entity.LoadingEntityEntry; import org.hibernate.sql.results.graph.entity.LoadingEntityEntry;
import org.hibernate.sql.results.internal.RowTransformerArrayImpl; import org.hibernate.sql.results.internal.RowTransformerArrayImpl;
@ -100,7 +101,7 @@ public class ConcreteSqmSelectQueryPlan<R> implements SelectQueryPlan<R> {
final SubselectFetch.RegistrationHandler subSelectFetchKeyHandler = SubselectFetch.createRegistrationHandler( final SubselectFetch.RegistrationHandler subSelectFetchKeyHandler = SubselectFetch.createRegistrationHandler(
session.getPersistenceContext().getBatchFetchQueue(), session.getPersistenceContext().getBatchFetchQueue(),
sqmInterpretation.selectStatement, sqmInterpretation.selectStatement,
Collections.emptyList(), JdbcParametersList.empty(),
jdbcParameterBindings jdbcParameterBindings
); );
@ -352,7 +353,7 @@ public class ConcreteSqmSelectQueryPlan<R> implements SelectQueryPlan<R> {
sqmInterpretation.getSqlAst() sqmInterpretation.getSqlAst()
); );
final Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> jdbcParamsXref final Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<JdbcParametersList>>> jdbcParamsXref
= SqmUtil.generateJdbcParamsXref( domainParameterXref, sqmInterpretation::getJdbcParamsBySqmParam ); = SqmUtil.generateJdbcParamsXref( domainParameterXref, sqmInterpretation::getJdbcParamsBySqmParam );
final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings( final JdbcParameterBindings jdbcParameterBindings = SqmUtil.createJdbcParameterBindings(
executionContext.getQueryParameterBindings(), executionContext.getQueryParameterBindings(),
@ -392,7 +393,7 @@ public class ConcreteSqmSelectQueryPlan<R> implements SelectQueryPlan<R> {
private final SelectStatement selectStatement; private final SelectStatement selectStatement;
private final JdbcOperationQuerySelect jdbcSelect; private final JdbcOperationQuerySelect jdbcSelect;
private final FromClauseAccess tableGroupAccess; private final FromClauseAccess tableGroupAccess;
private final Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> jdbcParamsXref; private final Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<JdbcParametersList>>> jdbcParamsXref;
private final Map<SqmParameter<?>, MappingModelExpressible<?>> sqmParameterMappingModelTypes; private final Map<SqmParameter<?>, MappingModelExpressible<?>> sqmParameterMappingModelTypes;
private transient JdbcParameterBindings firstParameterBindings; private transient JdbcParameterBindings firstParameterBindings;
@ -400,7 +401,7 @@ public class ConcreteSqmSelectQueryPlan<R> implements SelectQueryPlan<R> {
SelectStatement selectStatement, SelectStatement selectStatement,
JdbcOperationQuerySelect jdbcSelect, JdbcOperationQuerySelect jdbcSelect,
FromClauseAccess tableGroupAccess, FromClauseAccess tableGroupAccess,
Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> jdbcParamsXref, Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<JdbcParametersList>>> jdbcParamsXref,
Map<SqmParameter<?>, MappingModelExpressible<?>> sqmParameterMappingModelTypes, Map<SqmParameter<?>, MappingModelExpressible<?>> sqmParameterMappingModelTypes,
JdbcParameterBindings firstParameterBindings) { JdbcParameterBindings firstParameterBindings) {
this.selectStatement = selectStatement; this.selectStatement = selectStatement;
@ -423,7 +424,7 @@ public class ConcreteSqmSelectQueryPlan<R> implements SelectQueryPlan<R> {
return tableGroupAccess; return tableGroupAccess;
} }
Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> getJdbcParamsXref() { Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<JdbcParametersList>>> getJdbcParamsXref() {
return jdbcParamsXref; return jdbcParamsXref;
} }

View File

@ -39,6 +39,7 @@ import org.hibernate.sql.ast.tree.predicate.InSubQueryPredicate;
import org.hibernate.sql.ast.tree.select.QuerySpec; import org.hibernate.sql.ast.tree.select.QuerySpec;
import org.hibernate.sql.exec.spi.JdbcOperationQueryDelete; import org.hibernate.sql.exec.spi.JdbcOperationQueryDelete;
import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.sql.results.internal.SqlSelectionImpl; import org.hibernate.sql.results.internal.SqlSelectionImpl;
/** /**
@ -51,7 +52,7 @@ public class SimpleDeleteQueryPlan implements NonSelectQueryPlan {
private JdbcOperationQueryDelete jdbcDelete; private JdbcOperationQueryDelete jdbcDelete;
private SqmTranslation<DeleteStatement> sqmInterpretation; private SqmTranslation<DeleteStatement> sqmInterpretation;
private Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> jdbcParamsXref; private Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<JdbcParametersList>>> jdbcParamsXref;
public SimpleDeleteQueryPlan( public SimpleDeleteQueryPlan(
EntityMappingType entityDescriptor, EntityMappingType entityDescriptor,

View File

@ -30,6 +30,7 @@ import org.hibernate.sql.ast.tree.expression.JdbcParameter;
import org.hibernate.sql.ast.tree.insert.InsertStatement; import org.hibernate.sql.ast.tree.insert.InsertStatement;
import org.hibernate.sql.exec.spi.JdbcOperationQueryInsert; import org.hibernate.sql.exec.spi.JdbcOperationQueryInsert;
import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
/** /**
* @author Gavin King * @author Gavin King
@ -41,7 +42,7 @@ public class SimpleInsertQueryPlan implements NonSelectQueryPlan {
private JdbcOperationQueryInsert jdbcInsert; private JdbcOperationQueryInsert jdbcInsert;
private FromClauseAccess tableGroupAccess; private FromClauseAccess tableGroupAccess;
private Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> jdbcParamsXref; private Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<JdbcParametersList>>> jdbcParamsXref;
public SimpleInsertQueryPlan( public SimpleInsertQueryPlan(
SqmInsertStatement<?> sqmInsert, SqmInsertStatement<?> sqmInsert,

View File

@ -30,6 +30,7 @@ import org.hibernate.sql.ast.tree.expression.JdbcParameter;
import org.hibernate.sql.ast.tree.update.UpdateStatement; import org.hibernate.sql.ast.tree.update.UpdateStatement;
import org.hibernate.sql.exec.spi.JdbcOperationQueryUpdate; import org.hibernate.sql.exec.spi.JdbcOperationQueryUpdate;
import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcParametersList;
/** /**
* @author Steve Ebersole * @author Steve Ebersole
@ -40,7 +41,7 @@ public class SimpleUpdateQueryPlan implements NonSelectQueryPlan {
private JdbcOperationQueryUpdate jdbcUpdate; private JdbcOperationQueryUpdate jdbcUpdate;
private FromClauseAccess tableGroupAccess; private FromClauseAccess tableGroupAccess;
private Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> jdbcParamsXref; private Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<JdbcParametersList>>> jdbcParamsXref;
private Map<SqmParameter<?>, MappingModelExpressible<?>> sqmParamMappingTypeResolutions; private Map<SqmParameter<?>, MappingModelExpressible<?>> sqmParamMappingTypeResolutions;
public SimpleUpdateQueryPlan( public SimpleUpdateQueryPlan(

View File

@ -31,6 +31,7 @@ import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
import org.hibernate.metamodel.mapping.JdbcMapping; import org.hibernate.metamodel.mapping.JdbcMapping;
import org.hibernate.metamodel.mapping.MappingModelExpressible; import org.hibernate.metamodel.mapping.MappingModelExpressible;
import org.hibernate.metamodel.mapping.PluralAttributeMapping; import org.hibernate.metamodel.mapping.PluralAttributeMapping;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.hibernate.type.JavaObjectType; import org.hibernate.type.JavaObjectType;
import org.hibernate.type.descriptor.converter.spi.BasicValueConverter; import org.hibernate.type.descriptor.converter.spi.BasicValueConverter;
import org.hibernate.query.IllegalQueryOperationException; import org.hibernate.query.IllegalQueryOperationException;
@ -107,7 +108,7 @@ public class SqmUtil {
); );
} }
public static Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> generateJdbcParamsXref( public static Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<JdbcParametersList>>> generateJdbcParamsXref(
DomainParameterXref domainParameterXref, DomainParameterXref domainParameterXref,
JdbcParameterBySqmParameterAccess jdbcParameterBySqmParameterAccess) { JdbcParameterBySqmParameterAccess jdbcParameterBySqmParameterAccess) {
if ( domainParameterXref == null || !domainParameterXref.hasParameters() ) { if ( domainParameterXref == null || !domainParameterXref.hasParameters() ) {
@ -115,24 +116,28 @@ public class SqmUtil {
} }
final int queryParameterCount = domainParameterXref.getQueryParameterCount(); final int queryParameterCount = domainParameterXref.getQueryParameterCount();
final Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> result = new IdentityHashMap<>( queryParameterCount ); final Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<JdbcParametersList>>> result = new IdentityHashMap<>( queryParameterCount );
for ( Map.Entry<QueryParameterImplementor<?>, List<SqmParameter<?>>> entry : domainParameterXref.getSqmParamByQueryParam().entrySet() ) { for ( Map.Entry<QueryParameterImplementor<?>, List<SqmParameter<?>>> entry : domainParameterXref.getSqmParamByQueryParam().entrySet() ) {
final QueryParameterImplementor<?> queryParam = entry.getKey(); final QueryParameterImplementor<?> queryParam = entry.getKey();
final List<SqmParameter<?>> sqmParams = entry.getValue(); final List<SqmParameter<?>> sqmParams = entry.getValue();
final Map<SqmParameter<?>, List<List<JdbcParameter>>> sqmParamMap = result.computeIfAbsent( final Map<SqmParameter<?>, List<JdbcParametersList>> sqmParamMap = result.computeIfAbsent(
queryParam, queryParam,
qp -> new IdentityHashMap<>( sqmParams.size() ) qp -> new IdentityHashMap<>( sqmParams.size() )
); );
for ( SqmParameter<?> sqmParam : sqmParams ) { for ( SqmParameter<?> sqmParam : sqmParams ) {
sqmParamMap.put( sqmParam, jdbcParameterBySqmParameterAccess.getJdbcParamsBySqmParam().get( sqmParam ) ); List<List<JdbcParameter>> lists = jdbcParameterBySqmParameterAccess.getJdbcParamsBySqmParam().get(
sqmParam );
sqmParamMap.put( sqmParam, convert( lists ) );
final List<SqmParameter<?>> expansions = domainParameterXref.getExpansions( sqmParam ); final List<SqmParameter<?>> expansions = domainParameterXref.getExpansions( sqmParam );
if ( ! expansions.isEmpty() ) { if ( ! expansions.isEmpty() ) {
for ( SqmParameter<?> expansion : expansions ) { for ( SqmParameter<?> expansion : expansions ) {
sqmParamMap.put( expansion, jdbcParameterBySqmParameterAccess.getJdbcParamsBySqmParam().get( expansion ) ); List<List<JdbcParameter>> innerList = jdbcParameterBySqmParameterAccess.getJdbcParamsBySqmParam()
.get( expansion );
sqmParamMap.put( expansion, convert( innerList) );
result.put( queryParam, sqmParamMap ); result.put( queryParam, sqmParamMap );
} }
} }
@ -142,6 +147,17 @@ public class SqmUtil {
return result; return result;
} }
private static List<JdbcParametersList> convert(final List<List<JdbcParameter>> lists) {
if ( lists == null ) {
return null;
}
List<JdbcParametersList> output = new ArrayList<>( lists.size() );
for ( List<JdbcParameter> element : lists ) {
output.add( JdbcParametersList.fromList( element ) );
}
return output;
}
// public static JdbcParameterBindings buildJdbcParameterBindings( // public static JdbcParameterBindings buildJdbcParameterBindings(
// SqmStatement sqmStatement, // SqmStatement sqmStatement,
// JdbcParameterBySqmParameterAccess sqmInterpretation, // JdbcParameterBySqmParameterAccess sqmInterpretation,
@ -185,7 +201,7 @@ public class SqmUtil {
public static JdbcParameterBindings createJdbcParameterBindings( public static JdbcParameterBindings createJdbcParameterBindings(
QueryParameterBindings domainParamBindings, QueryParameterBindings domainParamBindings,
DomainParameterXref domainParameterXref, DomainParameterXref domainParameterXref,
Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<List<JdbcParameter>>>> jdbcParamXref, Map<QueryParameterImplementor<?>, Map<SqmParameter<?>, List<JdbcParametersList>>> jdbcParamXref,
MappingMetamodel domainModel, MappingMetamodel domainModel,
Function<NavigablePath, TableGroup> tableGroupLocator, Function<NavigablePath, TableGroup> tableGroupLocator,
SqmParameterMappingModelResolutionAccess mappingModelResolutionAccess, SqmParameterMappingModelResolutionAccess mappingModelResolutionAccess,
@ -201,7 +217,7 @@ public class SqmUtil {
final QueryParameterBinding<?> domainParamBinding = domainParamBindings.getBinding( queryParam ); final QueryParameterBinding<?> domainParamBinding = domainParamBindings.getBinding( queryParam );
final Map<SqmParameter<?>, List<List<JdbcParameter>>> jdbcParamMap = jdbcParamXref.get( queryParam ); final Map<SqmParameter<?>, List<JdbcParametersList>> jdbcParamMap = jdbcParamXref.get( queryParam );
for ( SqmParameter<?> sqmParameter : sqmParameters ) { for ( SqmParameter<?> sqmParameter : sqmParameters ) {
final MappingModelExpressible resolvedMappingModelType = mappingModelResolutionAccess final MappingModelExpressible resolvedMappingModelType = mappingModelResolutionAccess
.getResolvedMappingModelType( sqmParameter ); .getResolvedMappingModelType( sqmParameter );
@ -216,7 +232,7 @@ public class SqmUtil {
session.getFactory() session.getFactory()
); );
final List<List<JdbcParameter>> jdbcParamsBinds = jdbcParamMap.get( sqmParameter ); final List<JdbcParametersList> jdbcParamsBinds = jdbcParamMap.get( sqmParameter );
if ( jdbcParamsBinds == null ) { if ( jdbcParamsBinds == null ) {
// This can happen when a group or order by item expression, that contains parameters, // This can happen when a group or order by item expression, that contains parameters,
// is replaced with an alias reference expression, which can happen for JPA Criteria queries // is replaced with an alias reference expression, which can happen for JPA Criteria queries
@ -224,7 +240,7 @@ public class SqmUtil {
} }
if ( !domainParamBinding.isBound() ) { if ( !domainParamBinding.isBound() ) {
for ( int i = 0; i < jdbcParamsBinds.size(); i++ ) { for ( int i = 0; i < jdbcParamsBinds.size(); i++ ) {
final List<JdbcParameter> jdbcParams = jdbcParamsBinds.get( i ); final JdbcParametersList jdbcParams = jdbcParamsBinds.get( i );
parameterType.forEachJdbcType( parameterType.forEachJdbcType(
(position, jdbcMapping) -> { (position, jdbcMapping) -> {
jdbcParameterBindings.addBinding( jdbcParameterBindings.addBinding(
@ -241,7 +257,7 @@ public class SqmUtil {
// the original SqmParameter is the one we are processing.. create a binding for it.. // the original SqmParameter is the one we are processing.. create a binding for it..
for ( int i = 0; i < jdbcParamsBinds.size(); i++ ) { for ( int i = 0; i < jdbcParamsBinds.size(); i++ ) {
final List<JdbcParameter> jdbcParams = jdbcParamsBinds.get( i ); final JdbcParametersList jdbcParams = jdbcParamsBinds.get( i );
createValueBindings( createValueBindings(
jdbcParameterBindings, jdbcParameterBindings,
queryParam, queryParam,
@ -260,9 +276,9 @@ public class SqmUtil {
int expansionPosition = 0; int expansionPosition = 0;
while ( valueItr.hasNext() ) { while ( valueItr.hasNext() ) {
final SqmParameter<?> expansionSqmParam = expansions.get( expansionPosition++ ); final SqmParameter<?> expansionSqmParam = expansions.get( expansionPosition++ );
final List<List<JdbcParameter>> jdbcParamBinds = jdbcParamMap.get( expansionSqmParam ); final List<JdbcParametersList> jdbcParamBinds = jdbcParamMap.get( expansionSqmParam );
for ( int i = 0; i < jdbcParamBinds.size(); i++ ) { for ( int i = 0; i < jdbcParamBinds.size(); i++ ) {
List<JdbcParameter> expansionJdbcParams = jdbcParamBinds.get( i ); JdbcParametersList expansionJdbcParams = jdbcParamBinds.get( i );
createValueBindings( createValueBindings(
jdbcParameterBindings, jdbcParameterBindings,
queryParam, domainParamBinding, queryParam, domainParamBinding,
@ -277,7 +293,7 @@ public class SqmUtil {
} }
else if ( domainParamBinding.getBindValue() == null ) { else if ( domainParamBinding.getBindValue() == null ) {
for ( int i = 0; i < jdbcParamsBinds.size(); i++ ) { for ( int i = 0; i < jdbcParamsBinds.size(); i++ ) {
final List<JdbcParameter> jdbcParams = jdbcParamsBinds.get( i ); final JdbcParametersList jdbcParams = jdbcParamsBinds.get( i );
for ( int j = 0; j < jdbcParams.size(); j++ ) { for ( int j = 0; j < jdbcParams.size(); j++ ) {
final JdbcParameter jdbcParameter = jdbcParams.get( j ); final JdbcParameter jdbcParameter = jdbcParams.get( j );
jdbcParameterBindings.addBinding( jdbcParameterBindings.addBinding(
@ -304,7 +320,7 @@ public class SqmUtil {
final Object convertedValue = valueConverter.toRelationalValue( domainParamBinding.getBindValue() ); final Object convertedValue = valueConverter.toRelationalValue( domainParamBinding.getBindValue() );
for ( int i = 0; i < jdbcParamsBinds.size(); i++ ) { for ( int i = 0; i < jdbcParamsBinds.size(); i++ ) {
final List<JdbcParameter> jdbcParams = jdbcParamsBinds.get( i ); final JdbcParametersList jdbcParams = jdbcParamsBinds.get( i );
assert jdbcParams.size() == 1; assert jdbcParams.size() == 1;
final JdbcParameter jdbcParameter = jdbcParams.get( 0 ); final JdbcParameter jdbcParameter = jdbcParams.get( 0 );
jdbcParameterBindings.addBinding( jdbcParameterBindings.addBinding(
@ -318,7 +334,7 @@ public class SqmUtil {
final Object bindValue = domainParamBinding.getBindValue(); final Object bindValue = domainParamBinding.getBindValue();
for ( int i = 0; i < jdbcParamsBinds.size(); i++ ) { for ( int i = 0; i < jdbcParamsBinds.size(); i++ ) {
final List<JdbcParameter> jdbcParams = jdbcParamsBinds.get( i ); final JdbcParametersList jdbcParams = jdbcParamsBinds.get( i );
createValueBindings( createValueBindings(
jdbcParameterBindings, jdbcParameterBindings,
queryParam, queryParam,
@ -342,7 +358,7 @@ public class SqmUtil {
QueryParameterImplementor<?> domainParam, QueryParameterImplementor<?> domainParam,
QueryParameterBinding<?> domainParamBinding, QueryParameterBinding<?> domainParamBinding,
Bindable parameterType, Bindable parameterType,
List<JdbcParameter> jdbcParams, JdbcParametersList jdbcParams,
Object bindValue, Object bindValue,
Function<NavigablePath, TableGroup> tableGroupLocator, Function<NavigablePath, TableGroup> tableGroupLocator,
SharedSessionContractImplementor session) { SharedSessionContractImplementor session) {

View File

@ -64,7 +64,7 @@ public interface JdbcParameterBindings {
default int registerParametersForEachJdbcValue( default int registerParametersForEachJdbcValue(
Object value, Object value,
Bindable bindable, Bindable bindable,
List<JdbcParameter> jdbcParameters, JdbcParametersList jdbcParameters,
SharedSessionContractImplementor session) { SharedSessionContractImplementor session) {
return registerParametersForEachJdbcValue( value, 0, bindable, jdbcParameters, session ); return registerParametersForEachJdbcValue( value, 0, bindable, jdbcParameters, session );
} }
@ -73,7 +73,7 @@ public interface JdbcParameterBindings {
Object value, Object value,
int offset, int offset,
Bindable bindable, Bindable bindable,
List<JdbcParameter> jdbcParameters, JdbcParametersList jdbcParameters,
SharedSessionContractImplementor session) { SharedSessionContractImplementor session) {
return bindable.forEachJdbcValue( return bindable.forEachJdbcValue(
value, value,
@ -87,7 +87,7 @@ public interface JdbcParameterBindings {
private void createAndAddBinding( private void createAndAddBinding(
int selectionIndex, int selectionIndex,
List<JdbcParameter> params, JdbcParametersList params,
TypeConfiguration typeConfiguration, TypeConfiguration typeConfiguration,
Object jdbcValue, Object jdbcValue,
JdbcMapping type) { JdbcMapping type) {

View File

@ -0,0 +1,124 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
package org.hibernate.sql.exec.spi;
import java.util.List;
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
/**
* Conceptually similar to a List of JdbcParameters, but exposing a
* read-only immutable contract.
* Also as nice side effect, avoid any potential type pollution
* problems during access.
*/
public interface JdbcParametersList {
static final JdbcParametersList EMPTY = new JdbcParametersListMulti( new JdbcParameter[]{} );
public JdbcParameter get(int selectionIndex);
public int size();
public static Builder newBuilder() {
return newBuilder( 2 );
}
public static JdbcParametersList fromList(final List<JdbcParameter> originalList) {
final Builder builder = newBuilder( originalList.size() );
for ( JdbcParameter element : originalList ) {
builder.add( element );
}
return builder.build();
}
public static JdbcParametersList empty() {
return EMPTY;
}
public static JdbcParametersList singleton(final JdbcParameter p) {
return new JdbcParametersListSingleton( p );
}
public static Builder newBuilder(final int i) {
return new Builder( i );
}
public static class Builder {
private JdbcParameter[] array;
private int index = 0;
private Builder(final int sizeEstimate) {
this.array = new JdbcParameter[sizeEstimate];
}
public void add(final JdbcParameter jdbcParameter) {
if ( index >= array.length ) {
int newSize = Math.max( index + 2, array.length >> 1 );
JdbcParameter[] newArray = new JdbcParameter[newSize];
System.arraycopy( array, 0, newArray, 0, array.length );
this.array = newArray;
}
this.array[index++] = jdbcParameter;
}
public JdbcParametersList build() {
if ( index == 0 ) {
return EMPTY;
}
else if ( index == 1 ) {
return singleton( array[0] );
}
else if ( index == array.length ) {
return new JdbcParametersListMulti( array );
}
else {
JdbcParameter[] newArray = new JdbcParameter[index];
System.arraycopy( array, 0, newArray, 0, index );
return new JdbcParametersListMulti( newArray );
}
}
}
public final class JdbcParametersListMulti implements JdbcParametersList {
private final JdbcParameter[] array;
private JdbcParametersListMulti(JdbcParameter[] inputArray) {
this.array = inputArray;
}
public JdbcParameter get(int selectionIndex) {
return array[selectionIndex];
}
public int size() {
return array.length;
}
}
public final class JdbcParametersListSingleton implements JdbcParametersList {
private final JdbcParameter singleElement;
private JdbcParametersListSingleton(JdbcParameter singleElement) {
this.singleElement = singleElement;
}
public JdbcParameter get(int selectionIndex) {
if ( selectionIndex != 0 ) {
throw new ArrayIndexOutOfBoundsException( selectionIndex );
}
return singleElement;
}
public int size() {
return 1;
}
}
}

View File

@ -0,0 +1,126 @@
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.orm.test.customstructures;
import org.hibernate.sql.ast.tree.expression.JdbcParameter;
import org.hibernate.sql.exec.internal.JdbcParameterImpl;
import org.hibernate.sql.exec.spi.JdbcParametersList;
import org.junit.Assert;
import org.junit.Test;
/**
* Unit tests for JdbcParametersList
*/
public class JdbcParameterListTest {
@Test
public void emptyConstant() {
final JdbcParametersList empty = JdbcParametersList.empty();
expectsEmpty( empty );
}
@Test
public void singleton() {
final JdbcParameterImpl element = makeJdbcParameterElement();
final JdbcParametersList singleton = JdbcParametersList.singleton( element );
expectsSize( 1, singleton );
Assert.assertSame( element, singleton.get( 0 ) );
}
@Test
public void emptyBuilderDefault() {
final JdbcParametersList.Builder builder = JdbcParametersList.newBuilder();
expectsEmpty( builder.build() );
}
@Test
public void emptyBuilderSized() {
for ( int i = 0; i < 5; i++ ) {
final JdbcParametersList.Builder builder = JdbcParametersList.newBuilder( i );
expectsEmpty( builder.build() );
}
}
@Test
public void singletonBuilderDefault() {
final JdbcParametersList.Builder builder = JdbcParametersList.newBuilder();
verifyAsSingletonBuilder( builder );
}
private void verifyAsSingletonBuilder(JdbcParametersList.Builder builder) {
final JdbcParameterImpl element = makeJdbcParameterElement();
builder.add( element );
final JdbcParametersList built = builder.build();
expectsSize( 1, built );
Assert.assertSame( element, built.get( 0 ) );
}
@Test
public void singletonBuilderSized() {
for ( int i = 0; i < 5; i++ ) {
final JdbcParametersList.Builder builder = JdbcParametersList.newBuilder( i );
verifyAsSingletonBuilder( builder );
}
}
@Test
public void multiBuilderDefault() {
for ( int size = 0; size < 15; size++ ) {
final JdbcParametersList.Builder builder = JdbcParametersList.newBuilder();
verifyNparamBuilder( size, builder );
}
}
@Test
public void multiBuilderSized() {
for ( int hintSize = 0; hintSize < 5; hintSize++ ) {
for ( int size = 0; size < 15; size++ ) {
final JdbcParametersList.Builder builder = JdbcParametersList.newBuilder( hintSize );
verifyNparamBuilder( size, builder );
}
}
}
private void verifyNparamBuilder(final int size, final JdbcParametersList.Builder builder) {
final JdbcParameterImpl[] elements = new JdbcParameterImpl[size];
for ( int i = 0; i < size; i++ ) {
elements[i] = makeJdbcParameterElement();
}
for ( JdbcParameter element : elements ) {
builder.add( element );
}
final JdbcParametersList built = builder.build();
expectsSize( size, built );
for ( int i = 0; i < size; i++ ) {
Assert.assertSame( elements[i], built.get( i ) );
}
}
private static void expectsEmpty(JdbcParametersList empty) {
expectsSize( 0, empty );
}
private static void expectsSize(int size, JdbcParametersList list) {
Assert.assertEquals( size, list.size() );
for ( int i = 0; i < size; i++ ) {
Assert.assertNotNull( list.get( i ) );
}
if ( size == 0 ) {
Assert.assertSame( JdbcParametersList.empty(), list );
}
else if ( size == 1 ) {
Assert.assertTrue( list instanceof JdbcParametersList.JdbcParametersListSingleton );
}
Assert.assertThrows( ArrayIndexOutOfBoundsException.class, () -> list.get( size ) );
}
private static JdbcParameterImpl makeJdbcParameterElement() {
return new JdbcParameterImpl( null );
}
}