From 021429b519c2c50f264852f4737a8499d6e25d39 Mon Sep 17 00:00:00 2001 From: Andrea Boriero Date: Wed, 17 Aug 2022 16:50:08 +0200 Subject: [PATCH] HHH-15449 @ManyToOne associations not loaded correctly with default EAGER and batch fetch property set when using TypedQuery.resultStream --- .../sql/exec/internal/JdbcSelectExecutorStandardImpl.java | 6 ++++++ .../java/org/hibernate/sql/exec/spi/ExecutionContext.java | 4 ++++ .../hibernate/sql/results/graph/AssemblerCreationState.java | 4 ++++ .../graph/entity/internal/EntityFetchSelectImpl.java | 2 +- .../org/hibernate/sql/results/internal/ResultsHelper.java | 6 ++++++ 5 files changed, 21 insertions(+), 1 deletion(-) 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 2d0fb2a24369..68c965f8de61 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,6 +228,12 @@ private ExecutionContext getScrollContext(ExecutionContext context, PersistenceC final Limit limit = queryOptions.getLimit(); return new ExecutionContext() { + + @Override + public boolean isScrollResult() { + return true; + } + @Override public QueryOptions getQueryOptions() { 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 fd77d085db4c..12185b8c951e 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 @@ -21,6 +21,10 @@ */ public interface ExecutionContext { + default boolean isScrollResult(){ + return false; + } + SharedSessionContractImplementor getSession(); QueryOptions getQueryOptions(); diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/AssemblerCreationState.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/AssemblerCreationState.java index 882246b9993c..ea66857fbf46 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/AssemblerCreationState.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/AssemblerCreationState.java @@ -18,6 +18,10 @@ */ public interface AssemblerCreationState { + default boolean isScrollResult() { + return false; + } + LockMode determineEffectiveLockMode(String identificationVariable); Initializer resolveInitializer( diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/EntityFetchSelectImpl.java b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/EntityFetchSelectImpl.java index 4dc1bab3c552..464a26a01594 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/EntityFetchSelectImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/graph/entity/internal/EntityFetchSelectImpl.java @@ -69,7 +69,7 @@ public DomainResultAssembler createAssembler(FetchParentAccess parentAccess, keyResult.createResultAssembler( parentAccess, creationState ) ); } - if ( entityPersister.isBatchLoadable() ) { + if ( entityPersister.isBatchLoadable() && !creationState.isScrollResult() ) { return new BatchEntitySelectFetchInitializer( parentAccess, fetchedAttribute, diff --git a/hibernate-core/src/main/java/org/hibernate/sql/results/internal/ResultsHelper.java b/hibernate-core/src/main/java/org/hibernate/sql/results/internal/ResultsHelper.java index 8fb2d8620cc0..3e2f9970c85b 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/results/internal/ResultsHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/results/internal/ResultsHelper.java @@ -66,6 +66,12 @@ public static RowReader createRowReader( final List> assemblers = jdbcValues.getValuesMapping().resolveAssemblers( new AssemblerCreationState() { + + @Override + public boolean isScrollResult() { + return executionContext.isScrollResult(); + } + @Override public LockMode determineEffectiveLockMode(String identificationVariable) { return lockOptions.getEffectiveLockMode( identificationVariable );