diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/AbstractNaturalIdLoader.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/AbstractNaturalIdLoader.java index 4e57891c6e..50b5af9935 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/AbstractNaturalIdLoader.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/AbstractNaturalIdLoader.java @@ -44,10 +44,10 @@ import org.hibernate.sql.ast.tree.predicate.Predicate; import org.hibernate.sql.ast.tree.select.QuerySpec; import org.hibernate.sql.ast.tree.select.SelectStatement; +import org.hibernate.sql.exec.internal.BaseExecutionContext; import org.hibernate.sql.exec.internal.CallbackImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; import org.hibernate.sql.exec.spi.Callback; -import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcParameterBinding; import org.hibernate.sql.exec.spi.JdbcParameterBindings; @@ -203,35 +203,7 @@ protected L selectByNaturalId( final List results = session.getFactory().getJdbcServices().getJdbcSelectExecutor().list( jdbcSelect, jdbcParamBindings, - new ExecutionContext() { - private final Callback callback = new CallbackImpl(); - - @Override - public SharedSessionContractImplementor getSession() { - return session; - } - - @Override - public QueryOptions getQueryOptions() { - return queryOptions; - } - - @Override - public String getQueryIdentifier(String sql) { - return sql; - } - - @Override - public QueryParameterBindings getQueryParameterBindings() { - return QueryParameterBindings.NO_PARAM_BINDINGS; - } - - @Override - public Callback getCallback() { - return callback; - } - - }, + new NaturalIdLoaderWithOptionsExecutionContext( session, queryOptions ), row -> (L) row[0], ListResultsConsumer.UniqueSemantic.FILTER ); @@ -362,33 +334,7 @@ public Object resolveIdToNaturalId(Object id, SharedSessionContractImplementor s final List results = session.getFactory().getJdbcServices().getJdbcSelectExecutor().list( jdbcSelect, jdbcParamBindings, - new ExecutionContext() { - @Override - public SharedSessionContractImplementor getSession() { - return session; - } - - @Override - public QueryOptions getQueryOptions() { - return QueryOptions.NONE; - } - - @Override - public String getQueryIdentifier(String sql) { - return sql; - } - - @Override - public QueryParameterBindings getQueryParameterBindings() { - return QueryParameterBindings.NO_PARAM_BINDINGS; - } - - @Override - public Callback getCallback() { - throw new UnsupportedOperationException( "Follow-on locking not supported yet" ); - } - - }, + new NoCallbackExecutionContext( session ), (row) -> { // because we select the natural-id we want to "reduce" the result assert row.length == 1; @@ -435,4 +381,26 @@ private static ImmutableFetchList visitFetches( } return fetches.build(); } + + private static class NaturalIdLoaderWithOptionsExecutionContext extends BaseExecutionContext { + private final Callback callback; + private final QueryOptions queryOptions; + + public NaturalIdLoaderWithOptionsExecutionContext(SharedSessionContractImplementor session, QueryOptions queryOptions) { + super( session ); + this.queryOptions = queryOptions; + callback = new CallbackImpl(); + } + + @Override + public QueryOptions getQueryOptions() { + return queryOptions; + } + + @Override + public Callback getCallback() { + return callback; + } + + } } diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionElementLoaderByIndex.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionElementLoaderByIndex.java index ce942798c6..37ff815aa2 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionElementLoaderByIndex.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionElementLoaderByIndex.java @@ -12,7 +12,6 @@ import org.hibernate.LockOptions; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.jdbc.spi.JdbcServices; -import org.hibernate.engine.spi.CollectionKey; import org.hibernate.engine.spi.LoadQueryInfluencers; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; @@ -24,14 +23,12 @@ import org.hibernate.metamodel.mapping.PluralAttributeMapping; import org.hibernate.metamodel.mapping.internal.EntityCollectionPart; import org.hibernate.query.spi.QueryOptions; -import org.hibernate.query.spi.QueryParameterBindings; import org.hibernate.sql.ast.Clause; 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.exec.internal.BaseExecutionContext; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; -import org.hibernate.sql.exec.spi.Callback; -import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.results.internal.RowTransformerStandardImpl; @@ -139,38 +136,7 @@ public Object load(Object key, Object index, SharedSessionContractImplementor se List list = jdbcServices.getJdbcSelectExecutor().list( jdbcSelect, jdbcParameterBindings, - new ExecutionContext() { - @Override - public SharedSessionContractImplementor getSession() { - return session; - } - - @Override - public CollectionKey getCollectionKey() { - return null; - } - - @Override - public QueryOptions getQueryOptions() { - return QueryOptions.NONE; - } - - @Override - public String getQueryIdentifier(String sql) { - return sql; - } - - @Override - public QueryParameterBindings getQueryParameterBindings() { - return QueryParameterBindings.NO_PARAM_BINDINGS; - } - - @Override - public Callback getCallback() { - return null; - } - - }, + new BaseExecutionContext( session ), RowTransformerStandardImpl.instance(), ListResultsConsumer.UniqueSemantic.FILTER ); @@ -187,4 +153,5 @@ protected Object incrementIndexByBase(Object index) { } return index; } + } diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderBatchKey.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderBatchKey.java index 968642db25..bef774a246 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderBatchKey.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderBatchKey.java @@ -15,7 +15,6 @@ import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.engine.spi.CollectionKey; -import org.hibernate.engine.spi.EntityKey; import org.hibernate.engine.spi.LoadQueryInfluencers; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; @@ -24,17 +23,13 @@ import org.hibernate.loader.ast.spi.CollectionLoader; import org.hibernate.metamodel.mapping.PluralAttributeMapping; import org.hibernate.query.spi.QueryOptions; -import org.hibernate.query.spi.QueryParameterBindings; import org.hibernate.sql.ast.Clause; 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.exec.internal.JdbcParameterBindingsImpl; -import org.hibernate.sql.exec.spi.Callback; -import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcParameterBindings; -import org.hibernate.sql.results.graph.entity.LoadingEntityEntry; import org.hibernate.sql.results.internal.RowTransformerStandardImpl; import org.hibernate.sql.results.spi.ListResultsConsumer; @@ -201,38 +196,7 @@ private void batchLoad( jdbcServices.getJdbcSelectExecutor().list( jdbcSelect, jdbcParameterBindings, - new ExecutionContext() { - @Override - public SharedSessionContractImplementor getSession() { - return session; - } - - @Override - public QueryOptions getQueryOptions() { - return QueryOptions.NONE; - } - - @Override - public String getQueryIdentifier(String sql) { - return sql; - } - - @Override - public void registerLoadingEntityEntry(EntityKey entityKey, LoadingEntityEntry entry) { - subSelectFetchableKeysHandler.addKey( entityKey, entry ); - } - - @Override - public QueryParameterBindings getQueryParameterBindings() { - return QueryParameterBindings.NO_PARAM_BINDINGS; - } - - @Override - public Callback getCallback() { - return null; - } - - }, + new ExecutionContextWithSubselectFetchHandler( session, subSelectFetchableKeysHandler ), RowTransformerStandardImpl.instance(), ListResultsConsumer.UniqueSemantic.FILTER ); diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderSingleKey.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderSingleKey.java index 3ebfdd6afc..242b02cff9 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderSingleKey.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderSingleKey.java @@ -27,9 +27,8 @@ 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.exec.internal.BaseExecutionContext; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; -import org.hibernate.sql.exec.spi.Callback; -import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.results.graph.entity.LoadingEntityEntry; @@ -121,47 +120,36 @@ public PersistentCollection load(Object key, SharedSessionContractImplementor jdbcServices.getJdbcSelectExecutor().list( jdbcSelect, jdbcParameterBindings, - new ExecutionContext() { - @Override - public SharedSessionContractImplementor getSession() { - return session; - } - - @Override - public CollectionKey getCollectionKey() { - return collectionKey; - } - - @Override - public void registerLoadingEntityEntry(EntityKey entityKey, LoadingEntityEntry entry) { - subSelectFetchableKeysHandler.addKey( entityKey, entry ); - } - - @Override - public QueryOptions getQueryOptions() { - return QueryOptions.NONE; - } - - @Override - public String getQueryIdentifier(String sql) { - return sql; - } - - @Override - public QueryParameterBindings getQueryParameterBindings() { - return QueryParameterBindings.NO_PARAM_BINDINGS; - } - - @Override - public Callback getCallback() { - return null; - } - - }, + new CollectionLoaderSingleKeyExecutionContext( session, collectionKey, subSelectFetchableKeysHandler ), RowTransformerStandardImpl.instance(), ListResultsConsumer.UniqueSemantic.FILTER ); return session.getPersistenceContext().getCollection( collectionKey ); } + + private static class CollectionLoaderSingleKeyExecutionContext extends BaseExecutionContext { + private final CollectionKey collectionKey; + private final SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler; + + CollectionLoaderSingleKeyExecutionContext( + SharedSessionContractImplementor session, + CollectionKey collectionKey, + SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler) { + super( session ); + this.collectionKey = collectionKey; + this.subSelectFetchableKeysHandler = subSelectFetchableKeysHandler; + } + + @Override + public CollectionKey getCollectionKey() { + return collectionKey; + } + + @Override + public void registerLoadingEntityEntry(EntityKey entityKey, LoadingEntityEntry entry) { + subSelectFetchableKeysHandler.addKey( entityKey, entry ); + } + + } } diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderSubSelectFetch.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderSubSelectFetch.java index b60b7455e7..1a800cb336 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderSubSelectFetch.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/CollectionLoaderSubSelectFetch.java @@ -25,14 +25,10 @@ import org.hibernate.loader.ast.spi.CollectionLoader; import org.hibernate.metamodel.mapping.PluralAttributeMapping; import org.hibernate.query.spi.QueryOptions; -import org.hibernate.query.spi.QueryParameterBindings; import org.hibernate.sql.ast.SqlAstTranslatorFactory; import org.hibernate.sql.ast.tree.select.SelectStatement; -import org.hibernate.sql.exec.spi.Callback; -import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.results.graph.DomainResult; -import org.hibernate.sql.results.graph.entity.LoadingEntityEntry; import org.hibernate.sql.results.internal.ResultsHelper; import org.hibernate.sql.results.internal.RowTransformerStandardImpl; import org.hibernate.sql.results.spi.ListResultsConsumer; @@ -134,38 +130,7 @@ public PersistentCollection load(Object triggerKey, SharedSessionContractImpl jdbcServices.getJdbcSelectExecutor().list( jdbcSelect, this.subselect.getLoadingJdbcParameterBindings(), - new ExecutionContext() { - @Override - public SharedSessionContractImplementor getSession() { - return session; - } - - @Override - public QueryOptions getQueryOptions() { - return QueryOptions.NONE; - } - - @Override - public String getQueryIdentifier(String sql) { - return sql; - } - - @Override - public void registerLoadingEntityEntry(EntityKey entityKey, LoadingEntityEntry entry) { - subSelectFetchableKeysHandler.addKey( entityKey, entry ); - } - - @Override - public QueryParameterBindings getQueryParameterBindings() { - return QueryParameterBindings.NO_PARAM_BINDINGS; - } - - @Override - public Callback getCallback() { - return null; - } - - }, + new ExecutionContextWithSubselectFetchHandler( session, subSelectFetchableKeysHandler ), RowTransformerStandardImpl.instance(), ListResultsConsumer.UniqueSemantic.FILTER ); @@ -193,4 +158,5 @@ public Callback getCallback() { return collection; } + } diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/DatabaseSnapshotExecutor.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/DatabaseSnapshotExecutor.java index 6689ef7e1d..8013ab8ca9 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/DatabaseSnapshotExecutor.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/DatabaseSnapshotExecutor.java @@ -7,7 +7,6 @@ package org.hibernate.loader.ast.internal; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import org.hibernate.LockOptions; @@ -34,10 +33,9 @@ import org.hibernate.sql.ast.tree.predicate.ComparisonPredicate; import org.hibernate.sql.ast.tree.select.QuerySpec; import org.hibernate.sql.ast.tree.select.SelectStatement; +import org.hibernate.sql.exec.internal.BaseExecutionContext; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; import org.hibernate.sql.exec.internal.JdbcParameterImpl; -import org.hibernate.sql.exec.spi.Callback; -import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.results.graph.DomainResult; @@ -177,33 +175,7 @@ Object[] loadDatabaseSnapshot(Object id, SharedSessionContractImplementor sessio final List list = session.getJdbcServices().getJdbcSelectExecutor().list( jdbcSelect, jdbcParameterBindings, - new ExecutionContext() { - @Override - public SharedSessionContractImplementor getSession() { - return session; - } - - @Override - public QueryOptions getQueryOptions() { - return QueryOptions.NONE; - } - - @Override - public String getQueryIdentifier(String sql) { - return sql; - } - - @Override - public QueryParameterBindings getQueryParameterBindings() { - return QueryParameterBindings.NO_PARAM_BINDINGS; - } - - @Override - public Callback getCallback() { - return null; - } - - }, + new BaseExecutionContext( session ), RowTransformerDatabaseSnapshotImpl.instance(), ListResultsConsumer.UniqueSemantic.FILTER ); diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/ExecutionContextWithSubselectFetchHandler.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/ExecutionContextWithSubselectFetchHandler.java new file mode 100644 index 0000000000..06b57dcf85 --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/ExecutionContextWithSubselectFetchHandler.java @@ -0,0 +1,33 @@ +/* + * 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.loader.ast.internal; + +import org.hibernate.engine.spi.EntityKey; +import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.engine.spi.SubselectFetch; +import org.hibernate.sql.exec.internal.BaseExecutionContext; +import org.hibernate.sql.results.graph.entity.LoadingEntityEntry; + +class ExecutionContextWithSubselectFetchHandler extends BaseExecutionContext { + + private final SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler; + + public ExecutionContextWithSubselectFetchHandler( + SharedSessionContractImplementor session, + SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler) { + super( session ); + this.subSelectFetchableKeysHandler = subSelectFetchableKeysHandler; + } + + @Override + public void registerLoadingEntityEntry(EntityKey entityKey, LoadingEntityEntry entry) { + if ( subSelectFetchableKeysHandler != null ) { + subSelectFetchableKeysHandler.addKey( entityKey, entry ); + } + } + +} diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiIdLoaderStandard.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiIdLoaderStandard.java index 5f856306ad..19155a8d40 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiIdLoaderStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiIdLoaderStandard.java @@ -36,17 +36,13 @@ import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.query.spi.QueryOptions; -import org.hibernate.query.spi.QueryParameterBindings; import org.hibernate.sql.ast.Clause; 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.exec.internal.JdbcParameterBindingsImpl; -import org.hibernate.sql.exec.spi.Callback; -import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcParameterBindings; -import org.hibernate.sql.results.graph.entity.LoadingEntityEntry; import org.hibernate.sql.results.internal.RowTransformerStandardImpl; import org.hibernate.sql.results.spi.ListResultsConsumer; @@ -298,39 +294,7 @@ private List loadEntitiesById( return session.getJdbcServices().getJdbcSelectExecutor().list( jdbcSelect, jdbcParameterBindings, - new ExecutionContext() { - @Override - public SharedSessionContractImplementor getSession() { - return session; - } - - @Override - public QueryOptions getQueryOptions() { - return QueryOptions.NONE; - } - - @Override - public String getQueryIdentifier(String sql) { - return sql; - } - - @Override - public QueryParameterBindings getQueryParameterBindings() { - return QueryParameterBindings.NO_PARAM_BINDINGS; - } - - @Override - public Callback getCallback() { - return null; - } - - @Override - public void registerLoadingEntityEntry(EntityKey entityKey, LoadingEntityEntry entry) { - if ( subSelectFetchableKeysHandler != null ) { - subSelectFetchableKeysHandler.addKey( entityKey, entry ); - } - } - }, + new ExecutionContextWithSubselectFetchHandler( session, subSelectFetchableKeysHandler ), RowTransformerStandardImpl.instance(), ListResultsConsumer.UniqueSemantic.FILTER ); @@ -482,4 +446,5 @@ private Boolean getReadOnlyFromLoadQueryInfluencers(SharedSessionContractImpleme } return readOnly; } + } diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiNaturalIdLoadingBatcher.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiNaturalIdLoadingBatcher.java index 8942647f59..3c9f22b5b5 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiNaturalIdLoadingBatcher.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/MultiNaturalIdLoadingBatcher.java @@ -12,7 +12,6 @@ import org.hibernate.LockOptions; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.jdbc.spi.JdbcServices; -import org.hibernate.engine.spi.EntityKey; import org.hibernate.engine.spi.LoadQueryInfluencers; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.engine.spi.SharedSessionContractImplementor; @@ -22,17 +21,13 @@ import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.mapping.ModelPart; import org.hibernate.query.spi.QueryOptions; -import org.hibernate.query.spi.QueryParameterBindings; import org.hibernate.sql.ast.Clause; 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.exec.internal.JdbcParameterBindingsImpl; -import org.hibernate.sql.exec.spi.Callback; -import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcParameterBindings; -import org.hibernate.sql.results.graph.entity.LoadingEntityEntry; import org.hibernate.sql.results.internal.RowTransformerStandardImpl; import org.hibernate.sql.results.spi.ListResultsConsumer; @@ -164,41 +159,10 @@ private List performLoad(JdbcParameterBindings jdbcParamBindings, SharedS return session.getJdbcServices().getJdbcSelectExecutor().list( jdbcSelect, jdbcParamBindings, - new ExecutionContext() { - @Override - public SharedSessionContractImplementor getSession() { - return session; - } - - @Override - public QueryOptions getQueryOptions() { - return QueryOptions.NONE; - } - - @Override - public String getQueryIdentifier(String sql) { - return sql; - } - - @Override - public QueryParameterBindings getQueryParameterBindings() { - return QueryParameterBindings.NO_PARAM_BINDINGS; - } - - @Override - public Callback getCallback() { - return null; - } - - @Override - public void registerLoadingEntityEntry(EntityKey entityKey, LoadingEntityEntry entry) { - if ( subSelectFetchableKeysHandler != null ) { - subSelectFetchableKeysHandler.addKey( entityKey, entry ); - } - } - }, + new ExecutionContextWithSubselectFetchHandler( session, subSelectFetchableKeysHandler ), RowTransformerStandardImpl.instance(), ListResultsConsumer.UniqueSemantic.FILTER ); } + } diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/NoCallbackExecutionContext.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/NoCallbackExecutionContext.java new file mode 100644 index 0000000000..be53c01f2b --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/NoCallbackExecutionContext.java @@ -0,0 +1,25 @@ +/* + * 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 . + */ +package org.hibernate.loader.ast.internal; + +import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.query.spi.QueryParameterBindings; +import org.hibernate.sql.exec.internal.BaseExecutionContext; +import org.hibernate.sql.exec.spi.Callback; + +public class NoCallbackExecutionContext extends BaseExecutionContext { + + public NoCallbackExecutionContext(SharedSessionContractImplementor session) { + super( session ); + } + + @Override + public Callback getCallback() { + throw new UnsupportedOperationException( "Follow-on locking not supported yet" ); + } + +} diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleIdEntityLoaderDynamicBatch.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleIdEntityLoaderDynamicBatch.java index 29a47c8593..3b687dc141 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleIdEntityLoaderDynamicBatch.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleIdEntityLoaderDynamicBatch.java @@ -26,8 +26,8 @@ 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.exec.internal.BaseExecutionContext; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; -import org.hibernate.sql.exec.spi.Callback; import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcParameterBindings; @@ -165,7 +165,6 @@ public T load( final EntityKey entityKey = session.generateEntityKey( pkValue, getLoadable().getEntityPersister() ); //noinspection unchecked return (T) session.getPersistenceContext().getEntity( entityKey ); - } private ExecutionContext getExecutionContext( @@ -175,58 +174,13 @@ private ExecutionContext getExecutionContext( LockOptions lockOptions, SharedSessionContractImplementor session, SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler) { - return new ExecutionContext() { - @Override - public SharedSessionContractImplementor getSession() { - return session; - } - - @Override - public Object getEntityInstance() { - return entityInstance; - } - - @Override - public Object getEntityId() { - return entityId; - } - - @Override - public QueryOptions getQueryOptions() { - return new QueryOptionsAdapter() { - @Override - public Boolean isReadOnly() { - return readOnly; - } - - @Override - public LockOptions getLockOptions() { - return lockOptions; - } - }; - } - - @Override - public String getQueryIdentifier(String sql) { - return sql; - } - - @Override - public void registerLoadingEntityEntry(EntityKey entityKey, LoadingEntityEntry entry) { - subSelectFetchableKeysHandler.addKey( entityKey, entry ); - } - - @Override - public QueryParameterBindings getQueryParameterBindings() { - return QueryParameterBindings.NO_PARAM_BINDINGS; - } - - @Override - public Callback getCallback() { - return null; - } - - }; + return new SingleIdExecutionContext( session, + entityInstance, + entityId, + readOnly, + lockOptions, + subSelectFetchableKeysHandler + ); } private void initializeSingleIdLoaderIfNeeded(SharedSessionContractImplementor session) { @@ -235,4 +189,58 @@ private void initializeSingleIdLoaderIfNeeded(SharedSessionContractImplementor s singleIdLoader.prepare(); } } + + private static class SingleIdExecutionContext extends BaseExecutionContext { + private final Object entityInstance; + private final Object entityId; + private final Boolean readOnly; + private final LockOptions lockOptions; + private final SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler; + + public SingleIdExecutionContext( + SharedSessionContractImplementor session, + Object entityInstance, + Object entityId, + Boolean readOnly, + LockOptions lockOptions, + SubselectFetch.RegistrationHandler subSelectFetchableKeysHandler) { + super( session ); + this.entityInstance = entityInstance; + this.entityId = entityId; + this.readOnly = readOnly; + this.lockOptions = lockOptions; + this.subSelectFetchableKeysHandler = subSelectFetchableKeysHandler; + } + + @Override + public Object getEntityInstance() { + return entityInstance; + } + + @Override + public Object getEntityId() { + return entityId; + } + + @Override + public QueryOptions getQueryOptions() { + return new QueryOptionsAdapter() { + @Override + public Boolean isReadOnly() { + return readOnly; + } + + @Override + public LockOptions getLockOptions() { + return lockOptions; + } + }; + } + + @Override + public void registerLoadingEntityEntry(EntityKey entityKey, LoadingEntityEntry entry) { + subSelectFetchableKeysHandler.addKey( entityKey, entry ); + } + + } } diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleIdLoadPlan.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleIdLoadPlan.java index 5c7747c008..b0333987aa 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleIdLoadPlan.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleIdLoadPlan.java @@ -23,10 +23,10 @@ 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.exec.internal.BaseExecutionContext; import org.hibernate.sql.exec.internal.CallbackImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; import org.hibernate.sql.exec.spi.Callback; -import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.results.internal.RowTransformerStandardImpl; @@ -148,43 +148,7 @@ public T load( final List list = session.getJdbcServices().getJdbcSelectExecutor().list( jdbcSelect, jdbcParameterBindings, - new ExecutionContext() { - @Override - public SharedSessionContractImplementor getSession() { - return session; - } - - @Override - public Object getEntityInstance() { - return entityInstance; - } - - @Override - public Object getEntityId() { - return restrictedValue; - } - - @Override - public QueryOptions getQueryOptions() { - return queryOptions; - } - - @Override - public String getQueryIdentifier(String sql) { - return sql; - } - - @Override - public QueryParameterBindings getQueryParameterBindings() { - return QueryParameterBindings.NO_PARAM_BINDINGS; - } - - @Override - public Callback getCallback() { - return callback; - } - - }, + new SingleIdExecutionContext( session, entityInstance, restrictedValue, queryOptions, callback ), getRowTransformer(), singleResultExpected ? ListResultsConsumer.UniqueSemantic.ASSERT : ListResultsConsumer.UniqueSemantic.FILTER ); @@ -199,4 +163,45 @@ public Callback getCallback() { } return entity; } + + private static class SingleIdExecutionContext extends BaseExecutionContext { + private final Object entityInstance; + private final Object restrictedValue; + private final QueryOptions queryOptions; + private final Callback callback; + + public SingleIdExecutionContext( + SharedSessionContractImplementor session, + Object entityInstance, + Object restrictedValue, + QueryOptions queryOptions, + Callback callback) { + super( session ); + this.entityInstance = entityInstance; + this.restrictedValue = restrictedValue; + this.queryOptions = queryOptions; + this.callback = callback; + } + + @Override + public Object getEntityInstance() { + return entityInstance; + } + + @Override + public Object getEntityId() { + return restrictedValue; + } + + @Override + public QueryOptions getQueryOptions() { + return queryOptions; + } + + @Override + public Callback getCallback() { + return callback; + } + + } } diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleUniqueKeyEntityLoaderStandard.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleUniqueKeyEntityLoaderStandard.java index 048ce520ac..ae7f0e9d9a 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleUniqueKeyEntityLoaderStandard.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/SingleUniqueKeyEntityLoaderStandard.java @@ -23,16 +23,14 @@ import org.hibernate.metamodel.mapping.SingularAttributeMapping; import org.hibernate.metamodel.mapping.internal.ToOneAttributeMapping; import org.hibernate.query.spi.QueryOptions; -import org.hibernate.query.spi.QueryOptionsAdapter; -import org.hibernate.query.spi.QueryParameterBindings; import org.hibernate.sql.ast.Clause; 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.exec.internal.BaseExecutionContext; import org.hibernate.sql.exec.internal.CallbackImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; import org.hibernate.sql.exec.spi.Callback; -import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcParameterBindings; import org.hibernate.sql.results.spi.ListResultsConsumer; @@ -102,39 +100,7 @@ public T load( final List list = sessionFactory.getJdbcServices().getJdbcSelectExecutor().list( jdbcSelect, jdbcParameterBindings, - new ExecutionContext() { - private final Callback callback = new CallbackImpl(); - @Override - public SharedSessionContractImplementor getSession() { - return session; - } - - @Override - public QueryOptions getQueryOptions() { - return new QueryOptionsAdapter() { - @Override - public Boolean isReadOnly() { - return readOnly; - } - }; - } - - @Override - public String getQueryIdentifier(String sql) { - return sql; - } - - @Override - public QueryParameterBindings getQueryParameterBindings() { - return QueryParameterBindings.NO_PARAM_BINDINGS; - } - - @Override - public Callback getCallback() { - return callback; - } - - }, + new SingleUKEntityLoaderExecutionContext( session, readOnly ), row -> row[0], ListResultsConsumer.UniqueSemantic.FILTER ); @@ -191,33 +157,7 @@ public Object resolveId(Object ukValue, SharedSessionContractImplementor session final List list = sessionFactory.getJdbcServices().getJdbcSelectExecutor().list( jdbcSelect, jdbcParameterBindings, - new ExecutionContext() { - @Override - public SharedSessionContractImplementor getSession() { - return session; - } - - @Override - public QueryOptions getQueryOptions() { - return QueryOptions.NONE; - } - - @Override - public String getQueryIdentifier(String sql) { - return sql; - } - - @Override - public QueryParameterBindings getQueryParameterBindings() { - return QueryParameterBindings.NO_PARAM_BINDINGS; - } - - @Override - public Callback getCallback() { - throw new UnsupportedOperationException( "Follow-on locking not supported yet" ); - } - - }, + new NoCallbackExecutionContext( session ), row -> row[0], ListResultsConsumer.UniqueSemantic.FILTER ); @@ -226,4 +166,28 @@ public Callback getCallback() { return list.get( 0 ); } + + private static class SingleUKEntityLoaderExecutionContext extends BaseExecutionContext { + private final Callback callback; + private final QueryOptions queryOptions; + + public SingleUKEntityLoaderExecutionContext(SharedSessionContractImplementor session, Boolean readOnly) { + super( session ); + //Careful, readOnly is possibly null + this.queryOptions = readOnly == null ? QueryOptions.NONE : readOnly ? QueryOptions.READ_ONLY : QueryOptions.READ_WRITE; + callback = new CallbackImpl(); + } + + @Override + public QueryOptions getQueryOptions() { + return queryOptions; + } + + @Override + public Callback getCallback() { + return callback; + } + + } + } diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/GeneratedValuesProcessor.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/GeneratedValuesProcessor.java index 926ebecdca..8e752e779b 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/GeneratedValuesProcessor.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/GeneratedValuesProcessor.java @@ -17,18 +17,16 @@ import org.hibernate.generator.EventType; import org.hibernate.generator.InDatabaseGenerator; import org.hibernate.loader.ast.internal.LoaderSelectBuilder; -import org.hibernate.metamodel.UnsupportedMappingException; +import org.hibernate.loader.ast.internal.NoCallbackExecutionContext; import org.hibernate.metamodel.mapping.AttributeMapping; import org.hibernate.metamodel.mapping.EntityMappingType; import org.hibernate.metamodel.mapping.GeneratedValueResolver; import org.hibernate.metamodel.mapping.InDatabaseGeneratedValueResolver; import org.hibernate.query.spi.QueryOptions; -import org.hibernate.query.spi.QueryParameterBindings; import org.hibernate.sql.ast.Clause; import org.hibernate.sql.ast.tree.expression.JdbcParameter; import org.hibernate.sql.ast.tree.select.SelectStatement; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; -import org.hibernate.sql.exec.spi.Callback; import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import org.hibernate.sql.exec.spi.JdbcParameterBindings; @@ -161,32 +159,7 @@ private void setEntityAttributes( } private static ExecutionContext createExecutionContext(SharedSessionContractImplementor session) { - return new ExecutionContext() { - @Override - public SharedSessionContractImplementor getSession() { - return session; - } - - @Override - public QueryOptions getQueryOptions() { - return QueryOptions.NONE; - } - - @Override - public String getQueryIdentifier(String sql) { - return sql; - } - - @Override - public QueryParameterBindings getQueryParameterBindings() { - return QueryParameterBindings.NO_PARAM_BINDINGS; - } - - @Override - public Callback getCallback() { - throw new UnsupportedMappingException("Follow-on locking not supported yet"); - } - }; + return new NoCallbackExecutionContext( session ); } private static class GeneratedValueDescriptor { @@ -198,4 +171,5 @@ public GeneratedValueDescriptor(GeneratedValueResolver resolver, AttributeMappin this.attribute = attribute; } } + } diff --git a/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureCallImpl.java b/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureCallImpl.java index 7d859559fa..c635fed537 100644 --- a/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureCallImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/procedure/internal/ProcedureCallImpl.java @@ -55,8 +55,6 @@ import org.hibernate.query.spi.AbstractQuery; import org.hibernate.query.spi.MutableQueryOptions; import org.hibernate.query.spi.QueryImplementor; -import org.hibernate.query.spi.QueryOptions; -import org.hibernate.query.spi.QueryOptionsAdapter; import org.hibernate.query.spi.QueryParameterBinding; import org.hibernate.query.spi.QueryParameterBindings; import org.hibernate.query.spi.ScrollableResultsImplementor; @@ -65,13 +63,12 @@ import org.hibernate.result.Output; import org.hibernate.result.ResultSetOutput; import org.hibernate.result.UpdateCountOutput; +import org.hibernate.result.internal.OutputsExecutionContext; import org.hibernate.result.spi.ResultContext; import org.hibernate.sql.ast.tree.expression.JdbcParameter; -import org.hibernate.sql.exec.internal.CallbackImpl; import org.hibernate.sql.exec.internal.JdbcCallRefCursorExtractorImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingImpl; import org.hibernate.sql.exec.internal.JdbcParameterBindingsImpl; -import org.hibernate.sql.exec.spi.Callback; import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.exec.spi.JdbcCallParameterRegistration; import org.hibernate.sql.exec.spi.JdbcCallRefCursorExtractor; @@ -683,40 +680,7 @@ private ProcedureOutputsImpl buildOutputs() { } } - final ExecutionContext executionContext = new ExecutionContext() { - private final Callback callback = new CallbackImpl(); - - @Override - public SharedSessionContractImplementor getSession() { - return ProcedureCallImpl.this.getSession(); - } - - @Override - public QueryOptions getQueryOptions() { - return new QueryOptionsAdapter() { - @Override - public Boolean isReadOnly() { - return false; - } - }; - } - - @Override - public String getQueryIdentifier(String sql) { - return sql; - } - - @Override - public QueryParameterBindings getQueryParameterBindings() { - return QueryParameterBindings.NO_PARAM_BINDINGS; - } - - @Override - public Callback getCallback() { - return callback; - } - - }; + final ExecutionContext executionContext = new OutputsExecutionContext( getSession() ); // Note that this should actually happen in an executor @@ -1251,4 +1215,5 @@ public Stream getResultStream() { public ResultSetMapping getResultSetMapping() { return resultSetMapping; } + } diff --git a/hibernate-core/src/main/java/org/hibernate/query/spi/QueryOptions.java b/hibernate-core/src/main/java/org/hibernate/query/spi/QueryOptions.java index eb714c3059..6b62bb4f7c 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/spi/QueryOptions.java +++ b/hibernate-core/src/main/java/org/hibernate/query/spi/QueryOptions.java @@ -175,9 +175,25 @@ default boolean hasLimit() { default ListResultsConsumer.UniqueSemantic getUniqueSemantic(){ return null; } + /** - * Singleton access + * Provide singleton access for frequently needed options: */ QueryOptions NONE = new QueryOptionsAdapter() { }; + + QueryOptions READ_WRITE = new QueryOptionsAdapter() { + @Override + public Boolean isReadOnly() { + return Boolean.FALSE; + } + }; + + QueryOptions READ_ONLY = new QueryOptionsAdapter() { + @Override + public Boolean isReadOnly() { + return Boolean.TRUE; + } + }; + } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java index e339b9bd3e..653ccfd194 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java @@ -166,25 +166,7 @@ protected static SqmJdbcExecutionContextAdapter listInterpreterExecutionContext( DomainQueryExecutionContext executionContext, JdbcOperationQuerySelect jdbcSelect, SubselectFetch.RegistrationHandler subSelectFetchKeyHandler) { - return new SqmJdbcExecutionContextAdapter( executionContext, jdbcSelect ) { - @Override - public void registerLoadingEntityEntry(EntityKey entityKey, LoadingEntityEntry entry) { - subSelectFetchKeyHandler.addKey( entityKey, entry ); - } - - @Override - public String getQueryIdentifier(String sql) { - if ( CRITERIA_HQL_STRING.equals( hql ) ) { - return "[CRITERIA] " + sql; - } - return hql; - } - - @Override - public boolean hasQueryExecutionToBeAddedToStatistics() { - return true; - } - }; + return new MySqmJdbcExecutionContextAdapter( executionContext, jdbcSelect, subSelectFetchKeyHandler, hql ); } private static boolean containsCollectionFetches(QueryOptions queryOptions) { @@ -483,4 +465,33 @@ void setFirstParameterBindings(JdbcParameterBindings firstParameterBindings) { this.firstParameterBindings = firstParameterBindings; } } + + private static class MySqmJdbcExecutionContextAdapter extends SqmJdbcExecutionContextAdapter { + private final SubselectFetch.RegistrationHandler subSelectFetchKeyHandler; + private final String hql; + + public MySqmJdbcExecutionContextAdapter( + DomainQueryExecutionContext executionContext, + JdbcOperationQuerySelect jdbcSelect, + SubselectFetch.RegistrationHandler subSelectFetchKeyHandler, + String hql) { + super( executionContext, jdbcSelect ); + this.subSelectFetchKeyHandler = subSelectFetchKeyHandler; + this.hql = hql; + } + + @Override + public void registerLoadingEntityEntry(EntityKey entityKey, LoadingEntityEntry entry) { + subSelectFetchKeyHandler.addKey( entityKey, entry ); + } + + @Override + public String getQueryIdentifier(String sql) { + if ( CRITERIA_HQL_STRING.equals( hql ) ) { + return "[CRITERIA] " + sql; + } + return hql; + } + + } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmJdbcExecutionContextAdapter.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmJdbcExecutionContextAdapter.java index 9c9a1bead2..4fce725217 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmJdbcExecutionContextAdapter.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/SqmJdbcExecutionContextAdapter.java @@ -6,12 +6,11 @@ */ package org.hibernate.query.sqm.internal; -import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.query.spi.DomainQueryExecutionContext; import org.hibernate.query.spi.QueryOptions; import org.hibernate.query.spi.QueryParameterBindings; +import org.hibernate.sql.exec.internal.BaseExecutionContext; import org.hibernate.sql.exec.spi.Callback; -import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect; import static org.hibernate.query.spi.SqlOmittingQueryOptions.omitSqlQueryOptions; @@ -19,7 +18,7 @@ /** * ExecutionContext adapter delegating to a DomainQueryExecutionContext */ -public class SqmJdbcExecutionContextAdapter implements ExecutionContext { +public class SqmJdbcExecutionContextAdapter extends BaseExecutionContext { /** * Creates an adapter which drops any locking or paging details from the query options */ @@ -42,6 +41,7 @@ private SqmJdbcExecutionContextAdapter(DomainQueryExecutionContext sqmExecutionC } private SqmJdbcExecutionContextAdapter(DomainQueryExecutionContext sqmExecutionContext, QueryOptions queryOptions) { + super( sqmExecutionContext.getSession() ); this.sqmExecutionContext = sqmExecutionContext; this.queryOptions = queryOptions; } @@ -49,10 +49,6 @@ private SqmJdbcExecutionContextAdapter(DomainQueryExecutionContext sqmExecutionC public SqmJdbcExecutionContextAdapter(DomainQueryExecutionContext sqmExecutionContext, JdbcOperationQuerySelect jdbcSelect) { this( sqmExecutionContext, omitSqlQueryOptions( sqmExecutionContext.getQueryOptions(), jdbcSelect ) ); } - @Override - public SharedSessionContractImplementor getSession() { - return sqmExecutionContext.getSession(); - } @Override public QueryOptions getQueryOptions() { @@ -74,8 +70,4 @@ public boolean hasQueryExecutionToBeAddedToStatistics() { return true; } - @Override - public String getQueryIdentifier(String sql) { - return sql; - } } diff --git a/hibernate-core/src/main/java/org/hibernate/result/internal/OutputsExecutionContext.java b/hibernate-core/src/main/java/org/hibernate/result/internal/OutputsExecutionContext.java new file mode 100644 index 0000000000..a68caadecd --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/result/internal/OutputsExecutionContext.java @@ -0,0 +1,33 @@ +/* + * 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 . + */ +package org.hibernate.result.internal; + +import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.query.spi.QueryOptions; +import org.hibernate.query.spi.QueryParameterBindings; +import org.hibernate.sql.exec.internal.BaseExecutionContext; +import org.hibernate.sql.exec.internal.CallbackImpl; +import org.hibernate.sql.exec.spi.Callback; + +public class OutputsExecutionContext extends BaseExecutionContext { + private final Callback callback = new CallbackImpl(); + + public OutputsExecutionContext(SharedSessionContractImplementor session) { + super( session ); + } + + @Override + public QueryOptions getQueryOptions() { + return QueryOptions.READ_WRITE; + } + + @Override + public Callback getCallback() { + return callback; + } + +} diff --git a/hibernate-core/src/main/java/org/hibernate/result/internal/OutputsImpl.java b/hibernate-core/src/main/java/org/hibernate/result/internal/OutputsImpl.java index 7924fdff08..377dcfb19e 100644 --- a/hibernate-core/src/main/java/org/hibernate/result/internal/OutputsImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/result/internal/OutputsImpl.java @@ -21,21 +21,14 @@ import org.hibernate.JDBCException; import org.hibernate.NotYetImplementedFor6Exception; import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.CoreLogging; import org.hibernate.procedure.internal.ProcedureCallImpl; import org.hibernate.procedure.internal.ScalarDomainResultBuilder; -import org.hibernate.procedure.spi.FunctionReturnImplementor; import org.hibernate.query.procedure.ProcedureParameter; import org.hibernate.query.results.ResultSetMapping; -import org.hibernate.query.spi.QueryOptions; -import org.hibernate.query.spi.QueryOptionsAdapter; -import org.hibernate.query.spi.QueryParameterBindings; import org.hibernate.result.Output; import org.hibernate.result.Outputs; import org.hibernate.result.spi.ResultContext; -import org.hibernate.sql.exec.internal.CallbackImpl; -import org.hibernate.sql.exec.spi.Callback; import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.results.NoMoreOutputsException; import org.hibernate.sql.results.internal.ResultsHelper; @@ -182,40 +175,7 @@ protected List extractResults(ResultSet resultSet) { } ); - final ExecutionContext executionContext = new ExecutionContext() { - private final Callback callback = new CallbackImpl(); - - @Override - public SharedSessionContractImplementor getSession() { - return OutputsImpl.this.context.getSession(); - } - - @Override - public QueryOptions getQueryOptions() { - return new QueryOptionsAdapter() { - @Override - public Boolean isReadOnly() { - return false; - } - }; - } - - @Override - public String getQueryIdentifier(String sql) { - return sql; - } - - @Override - public QueryParameterBindings getQueryParameterBindings() { - return QueryParameterBindings.NO_PARAM_BINDINGS; - } - - @Override - public Callback getCallback() { - return callback; - } - - }; + final ExecutionContext executionContext = new OutputsExecutionContext( context.getSession() ); final JdbcValues jdbcValues = new JdbcValuesResultSetImpl( resultSetAccess, diff --git a/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/BaseExecutionContext.java b/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/BaseExecutionContext.java new file mode 100644 index 0000000000..a9c3477054 --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/BaseExecutionContext.java @@ -0,0 +1,59 @@ +/* + * 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.internal; + +import org.hibernate.engine.spi.LoadQueryInfluencers; +import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.query.spi.QueryOptions; +import org.hibernate.query.spi.QueryParameterBindings; +import org.hibernate.sql.exec.spi.Callback; +import org.hibernate.sql.exec.spi.ExecutionContext; + +public class BaseExecutionContext implements ExecutionContext { + + private final SharedSessionContractImplementor session; + + public BaseExecutionContext(SharedSessionContractImplementor session) { + this.session = session; + } + + // Optimization: mark this as final so to avoid a megamorphic call on this + // as it will never need to be implemented differently. + @Override + public final SharedSessionContractImplementor getSession() { + return session; + } + + // Also marked as final for the same reason + @Override + public final LoadQueryInfluencers getLoadQueryInfluencers() { + return session.getLoadQueryInfluencers(); + } + + // Unable to avoid the megamorphic calls in this case, but at least + // let's reduce this to the most common case. + @Override + public QueryOptions getQueryOptions() { + return QueryOptions.NONE; + } + + @Override + public String getQueryIdentifier(String sql) { + return sql; + } + + @Override + public Callback getCallback() { + return null; + } + + @Override + public QueryParameterBindings getQueryParameterBindings() { + return QueryParameterBindings.NO_PARAM_BINDINGS; + } + +} diff --git a/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/DelegatingExecutionContext.java b/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/DelegatingExecutionContext.java deleted file mode 100644 index 05198013ad..0000000000 --- a/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/DelegatingExecutionContext.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * 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.internal; - -import org.hibernate.engine.spi.CollectionKey; -import org.hibernate.engine.spi.EntityKey; -import org.hibernate.engine.spi.LoadQueryInfluencers; -import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.query.spi.QueryOptions; -import org.hibernate.query.spi.QueryParameterBindings; -import org.hibernate.resource.jdbc.spi.LogicalConnectionImplementor; -import org.hibernate.sql.exec.spi.Callback; -import org.hibernate.sql.exec.spi.ExecutionContext; -import org.hibernate.sql.results.graph.entity.LoadingEntityEntry; - -/** - * @author Christian Beikov - */ -public class DelegatingExecutionContext implements ExecutionContext { - - private final ExecutionContext executionContext; - - public DelegatingExecutionContext(ExecutionContext executionContext) { - this.executionContext = executionContext; - } - - @Override - public String getQueryIdentifier(String sql) { - return executionContext.getQueryIdentifier( sql ); - } - - @Override - public SharedSessionContractImplementor getSession() { - return executionContext.getSession(); - } - - @Override - public QueryOptions getQueryOptions() { - return executionContext.getQueryOptions(); - } - - @Override - public LoadQueryInfluencers getLoadQueryInfluencers() { - return executionContext.getLoadQueryInfluencers(); - } - - @Override - public QueryParameterBindings getQueryParameterBindings() { - return executionContext.getQueryParameterBindings(); - } - - @Override - public Callback getCallback() { - return executionContext.getCallback(); - } - - @Override - public CollectionKey getCollectionKey() { - return executionContext.getCollectionKey(); - } - - @Override - public Object getEntityInstance() { - return executionContext.getEntityInstance(); - } - - @Override - public Object getEntityId() { - return executionContext.getEntityId(); - } - - @Override - public void registerLoadingEntityEntry( - EntityKey entityKey, - LoadingEntityEntry entry) { - executionContext.registerLoadingEntityEntry( entityKey, entry ); - } - - @Override - public void afterStatement(LogicalConnectionImplementor logicalConnection) { - executionContext.afterStatement( logicalConnection ); - } - -} diff --git a/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java index 12ea5b2801..1bfc7978ec 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/exec/internal/JdbcSelectExecutorStandardImpl.java @@ -228,109 +228,24 @@ private ExecutionContext getScrollContext(ExecutionContext context, PersistenceC final Integer fetchSize = queryOptions.getFetchSize(); final Limit limit = queryOptions.getLimit(); - return new ExecutionContext() { - - @Override - public boolean isScrollResult() { - return true; - } - - @Override - public QueryOptions getQueryOptions() { - - return new QueryOptions() { - @Override - public Integer getTimeout() { - return timeout; - } - - @Override - public FlushMode getFlushMode() { - return flushMode; - } - - @Override - public Boolean isReadOnly() { - return readOnly; - } - - @Override - public AppliedGraph getAppliedGraph() { - return appliedGraph; - } - - @Override - public TupleTransformer getTupleTransformer() { - return tupleTransformer; - } - - @Override - public ResultListTransformer getResultListTransformer() { - return resultListTransformer; - } - - @Override - public Boolean isResultCachingEnabled() { - return resultCachingEnabled; - } - - @Override - public CacheRetrieveMode getCacheRetrieveMode() { - return cacheRetrieveMode; - } - - @Override - public CacheStoreMode getCacheStoreMode() { - return cacheStoreMode; - } - - @Override - public String getResultCacheRegionName() { - return resultCacheRegionName; - } - - @Override - public LockOptions getLockOptions() { - return lockOptions; - } - - @Override - public String getComment() { - return comment; - } - - @Override - public List getDatabaseHints() { - return databaseHints; - } - - @Override - public Integer getFetchSize() { - return fetchSize; - } - - @Override - public Limit getLimit() { - return limit; - } - }; - } - - @Override - public QueryParameterBindings getQueryParameterBindings() { - return context.getQueryParameterBindings(); - } - - @Override - public Callback getCallback() { - return context.getCallback(); - } - - @Override - public SharedSessionContractImplementor getSession() { - return context.getSession(); - } - }; + return new JdbcSelectExecutionContext( + timeout, + flushMode, + readOnly, + appliedGraph, + tupleTransformer, + resultListTransformer, + resultCachingEnabled, + cacheRetrieveMode, + cacheStoreMode, + resultCacheRegionName, + lockOptions, + comment, + databaseHints, + fetchSize, + limit, + context + ); } private T doExecuteQuery( @@ -725,4 +640,156 @@ public BasicType resolveType( } } + + private static class JdbcSelectExecutionContext extends BaseExecutionContext implements QueryOptions { + + private final Integer timeout; + private final FlushMode flushMode; + private final Boolean readOnly; + private final AppliedGraph appliedGraph; + private final TupleTransformer tupleTransformer; + private final ResultListTransformer resultListTransformer; + private final Boolean resultCachingEnabled; + private final CacheRetrieveMode cacheRetrieveMode; + private final CacheStoreMode cacheStoreMode; + private final String resultCacheRegionName; + private final LockOptions lockOptions; + private final String comment; + private final List databaseHints; + private final Integer fetchSize; + private final Limit limit; + private final ExecutionContext context; + + public JdbcSelectExecutionContext( + Integer timeout, + FlushMode flushMode, + Boolean readOnly, + AppliedGraph appliedGraph, + TupleTransformer tupleTransformer, + ResultListTransformer resultListTransformer, + Boolean resultCachingEnabled, + CacheRetrieveMode cacheRetrieveMode, + CacheStoreMode cacheStoreMode, + String resultCacheRegionName, + LockOptions lockOptions, + String comment, + List databaseHints, + Integer fetchSize, + Limit limit, + ExecutionContext context) { + super( context.getSession() ); + this.timeout = timeout; + this.flushMode = flushMode; + this.readOnly = readOnly; + this.appliedGraph = appliedGraph; + this.tupleTransformer = tupleTransformer; + this.resultListTransformer = resultListTransformer; + this.resultCachingEnabled = resultCachingEnabled; + this.cacheRetrieveMode = cacheRetrieveMode; + this.cacheStoreMode = cacheStoreMode; + this.resultCacheRegionName = resultCacheRegionName; + this.lockOptions = lockOptions; + this.comment = comment; + this.databaseHints = databaseHints; + this.fetchSize = fetchSize; + this.limit = limit; + this.context = context; + } + + @Override + public boolean isScrollResult() { + return true; + } + + @Override + public QueryOptions getQueryOptions() { + return this; + } + + @Override + public Integer getTimeout() { + return timeout; + } + + @Override + public FlushMode getFlushMode() { + return flushMode; + } + + @Override + public Boolean isReadOnly() { + return readOnly; + } + + @Override + public AppliedGraph getAppliedGraph() { + return appliedGraph; + } + + @Override + public TupleTransformer getTupleTransformer() { + return tupleTransformer; + } + + @Override + public ResultListTransformer getResultListTransformer() { + return resultListTransformer; + } + + @Override + public Boolean isResultCachingEnabled() { + return resultCachingEnabled; + } + + @Override + public CacheRetrieveMode getCacheRetrieveMode() { + return cacheRetrieveMode; + } + + @Override + public CacheStoreMode getCacheStoreMode() { + return cacheStoreMode; + } + + @Override + public String getResultCacheRegionName() { + return resultCacheRegionName; + } + + @Override + public LockOptions getLockOptions() { + return lockOptions; + } + + @Override + public String getComment() { + return comment; + } + + @Override + public List getDatabaseHints() { + return databaseHints; + } + + @Override + public Integer getFetchSize() { + return fetchSize; + } + + @Override + public Limit getLimit() { + return limit; + } + + @Override + public QueryParameterBindings getQueryParameterBindings() { + return context.getQueryParameterBindings(); + } + + @Override + public Callback getCallback() { + return context.getCallback(); + } + + } } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/exec/spi/ExecutionContext.java b/hibernate-core/src/main/java/org/hibernate/sql/exec/spi/ExecutionContext.java index 12185b8c95..1c7461959e 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/exec/spi/ExecutionContext.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/exec/spi/ExecutionContext.java @@ -29,17 +29,13 @@ default boolean isScrollResult(){ QueryOptions getQueryOptions(); - default LoadQueryInfluencers getLoadQueryInfluencers() { - return getSession().getLoadQueryInfluencers(); - } + LoadQueryInfluencers getLoadQueryInfluencers(); QueryParameterBindings getQueryParameterBindings(); Callback getCallback(); - default String getQueryIdentifier(String sql) { - return null; - } + String getQueryIdentifier(String sql); /** * Get the collection key for the collection which is to be loaded immediately. diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/NestedRowProcessingState.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/NestedRowProcessingState.java index b66760b7b2..51b5ed7fba 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/NestedRowProcessingState.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/embeddable/internal/NestedRowProcessingState.java @@ -6,10 +6,10 @@ */ package org.hibernate.sql.results.graph.embeddable.internal; -import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.query.spi.QueryOptions; import org.hibernate.query.spi.QueryParameterBindings; import org.hibernate.spi.NavigablePath; +import org.hibernate.sql.exec.internal.BaseExecutionContext; import org.hibernate.sql.exec.spi.Callback; import org.hibernate.sql.results.graph.Initializer; import org.hibernate.sql.results.graph.entity.EntityFetch; @@ -17,13 +17,14 @@ import org.hibernate.sql.results.jdbc.spi.RowProcessingState; import org.hibernate.sql.results.spi.RowReader; -public class NestedRowProcessingState implements RowProcessingState { +public class NestedRowProcessingState extends BaseExecutionContext implements RowProcessingState { private final AggregateEmbeddableInitializer aggregateEmbeddableInitializer; final RowProcessingState processingState; public NestedRowProcessingState( AggregateEmbeddableInitializer aggregateEmbeddableInitializer, RowProcessingState processingState) { + super( processingState.getSession() ); this.aggregateEmbeddableInitializer = aggregateEmbeddableInitializer; this.processingState = processingState; } @@ -78,11 +79,6 @@ public Initializer resolveInitializer(NavigablePath path) { return processingState.resolveInitializer( path ); } - @Override - public SharedSessionContractImplementor getSession() { - return processingState.getSession(); - } - @Override public QueryOptions getQueryOptions() { return processingState.getQueryOptions(); diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/internal/RowProcessingStateStandardImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/results/internal/RowProcessingStateStandardImpl.java index 5ae3f1919f..9d4fd0a905 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/internal/RowProcessingStateStandardImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/internal/RowProcessingStateStandardImpl.java @@ -9,10 +9,10 @@ import java.util.List; import org.hibernate.engine.spi.CollectionKey; -import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.spi.NavigablePath; import org.hibernate.query.spi.QueryOptions; import org.hibernate.query.spi.QueryParameterBindings; +import org.hibernate.sql.exec.internal.BaseExecutionContext; import org.hibernate.sql.exec.spi.Callback; import org.hibernate.sql.exec.spi.ExecutionContext; import org.hibernate.sql.results.graph.Initializer; @@ -27,7 +27,7 @@ /** * Standard RowProcessingState implementation */ -public class RowProcessingStateStandardImpl implements RowProcessingState { +public class RowProcessingStateStandardImpl extends BaseExecutionContext implements RowProcessingState { private static final Initializer[] NO_INITIALIZERS = new Initializer[0]; private final JdbcValuesSourceProcessingStateStandardImpl resultSetProcessingState; @@ -44,6 +44,7 @@ public RowProcessingStateStandardImpl( ExecutionContext executionContext, RowReader rowReader, JdbcValues jdbcValues) { + super( resultSetProcessingState.getSession() ); this.resultSetProcessingState = resultSetProcessingState; this.executionContext = executionContext; this.rowReader = rowReader; @@ -154,11 +155,6 @@ public boolean isQueryCacheHit() { public void finishRowProcessing() { } - @Override - public SharedSessionContractImplementor getSession() { - return getJdbcValuesSourceProcessingState().getExecutionContext().getSession(); - } - @Override public QueryOptions getQueryOptions() { return executionContext.getQueryOptions(); diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/spi/JdbcValuesSourceProcessingState.java b/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/spi/JdbcValuesSourceProcessingState.java index b792cb1fd5..37612b1d37 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/spi/JdbcValuesSourceProcessingState.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/jdbc/spi/JdbcValuesSourceProcessingState.java @@ -30,9 +30,7 @@ public interface JdbcValuesSourceProcessingState { ExecutionContext getExecutionContext(); - default SharedSessionContractImplementor getSession() { - return getExecutionContext().getSession(); - } + SharedSessionContractImplementor getSession(); default QueryOptions getQueryOptions() { return getExecutionContext().getQueryOptions();