HHH-17689 Cache SQL statement for unique key lookup

This commit is contained in:
Christian Beikov 2024-01-30 18:47:00 +01:00
parent 757452ef43
commit c7114ce442
1 changed files with 22 additions and 21 deletions

View File

@ -41,6 +41,8 @@ import org.hibernate.sql.results.spi.ListResultsConsumer;
public class SingleUniqueKeyEntityLoaderStandard<T> implements SingleUniqueKeyEntityLoader<T> { public class SingleUniqueKeyEntityLoaderStandard<T> implements SingleUniqueKeyEntityLoader<T> {
private final EntityMappingType entityDescriptor; private final EntityMappingType entityDescriptor;
private final ModelPart uniqueKeyAttribute; private final ModelPart uniqueKeyAttribute;
private final JdbcParametersList jdbcParameters;
private final JdbcOperationQuerySelect jdbcSelect;
public SingleUniqueKeyEntityLoaderStandard( public SingleUniqueKeyEntityLoaderStandard(
EntityMappingType entityDescriptor, EntityMappingType entityDescriptor,
@ -52,6 +54,26 @@ public class SingleUniqueKeyEntityLoaderStandard<T> implements SingleUniqueKeyEn
else { else {
this.uniqueKeyAttribute = uniqueKeyAttribute; this.uniqueKeyAttribute = uniqueKeyAttribute;
} }
final SessionFactoryImplementor sessionFactory = entityDescriptor.getEntityPersister().getFactory();
final JdbcParametersList.Builder builder = JdbcParametersList.newBuilder();
final SelectStatement sqlAst = LoaderSelectBuilder.createSelectByUniqueKey(
entityDescriptor,
Collections.emptyList(),
uniqueKeyAttribute,
null,
LoadQueryInfluencers.NONE,
LockOptions.NONE,
builder::add,
sessionFactory
);
final JdbcServices jdbcServices = sessionFactory.getJdbcServices();
final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment();
final SqlAstTranslatorFactory sqlAstTranslatorFactory = jdbcEnvironment.getSqlAstTranslatorFactory();
this.jdbcParameters = builder.build();
this.jdbcSelect = sqlAstTranslatorFactory.buildSelectTranslator( sessionFactory, sqlAst )
.translate( JdbcParameterBindings.NO_BINDINGS, QueryOptions.NONE );
} }
@Override @Override
@ -67,24 +89,6 @@ public class SingleUniqueKeyEntityLoaderStandard<T> implements SingleUniqueKeyEn
SharedSessionContractImplementor session) { SharedSessionContractImplementor session) {
final SessionFactoryImplementor sessionFactory = session.getFactory(); final SessionFactoryImplementor sessionFactory = session.getFactory();
// todo (6.0) : cache the SQL AST and JdbcParameters
JdbcParametersList.Builder builder = JdbcParametersList.newBuilder();
final SelectStatement sqlAst = LoaderSelectBuilder.createSelectByUniqueKey(
entityDescriptor,
Collections.emptyList(),
uniqueKeyAttribute,
null,
LoadQueryInfluencers.NONE,
LockOptions.NONE,
builder::add,
sessionFactory
);
final JdbcServices jdbcServices = sessionFactory.getJdbcServices();
final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment();
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(
ukValue, ukValue,
@ -93,9 +97,6 @@ public class SingleUniqueKeyEntityLoaderStandard<T> implements SingleUniqueKeyEn
session session
); );
assert offset == jdbcParameters.size(); assert offset == jdbcParameters.size();
final JdbcOperationQuerySelect jdbcSelect = sqlAstTranslatorFactory.buildSelectTranslator( sessionFactory, sqlAst )
.translate( jdbcParameterBindings, QueryOptions.NONE );
final List<Object> list = sessionFactory.getJdbcServices().getJdbcSelectExecutor().list( final List<Object> list = sessionFactory.getJdbcServices().getJdbcSelectExecutor().list(
jdbcSelect, jdbcSelect,
jdbcParameterBindings, jdbcParameterBindings,