HHH-16679 Avoid type pollution problems on iterations of List<JdbcParameter>
This commit is contained in:
parent
f54ff9de3e
commit
bf82d53516
|
@ -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;
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -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 );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue