Skip to content

Commit ff2d367

Browse files
committed
HHH-19874 NullPointerException in org.hibernate.sql.ast.tree.from.TableGroup.resolveTableReference
1 parent af26c3f commit ff2d367

File tree

3 files changed

+17
-5
lines changed

3 files changed

+17
-5
lines changed

hibernate-core/src/main/java/org/hibernate/engine/internal/StatefulPersistenceContext.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import org.hibernate.pretty.MessageHelper;
5656
import org.hibernate.proxy.HibernateProxy;
5757
import org.hibernate.proxy.LazyInitializer;
58+
import org.hibernate.spi.NavigablePath;
5859
import org.hibernate.sql.exec.spi.Callback;
5960
import org.hibernate.sql.results.graph.entity.EntityInitializer;
6061
import org.hibernate.sql.results.jdbc.spi.JdbcValuesSourceProcessingState;
@@ -405,6 +406,11 @@ public EntityHolder claimEntityHolderIfPossible(
405406
else {
406407
newEntityHolder = null;
407408
}
409+
410+
// We need the "original" navigable path in case of subselect in order to retrieve the correct TableGroup
411+
if ( holder.entityInitializer == null ) {
412+
holder.navigablePath = initializer.getNavigablePath();
413+
}
408414
holder.entityInitializer = initializer;
409415
return holder;
410416
}
@@ -2176,6 +2182,7 @@ private static class EntityHolderImpl implements EntityHolder, Serializable {
21762182
private @Nullable EntityEntry entityEntry;
21772183
private EntityInitializer<?> entityInitializer;
21782184
private EntityHolderState state;
2185+
private NavigablePath navigablePath;
21792186

21802187
private EntityHolderImpl() {
21812188
this.state = EntityHolderState.UNINITIALIZED;
@@ -2201,6 +2208,11 @@ public EntityPersister getDescriptor() {
22012208
return descriptor;
22022209
}
22032210

2211+
@Override
2212+
public NavigablePath getNavigablePath() {
2213+
return navigablePath;
2214+
}
2215+
22042216
@Override
22052217
public Object getEntity() {
22062218
return entity;

hibernate-core/src/main/java/org/hibernate/engine/spi/EntityHolder.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.hibernate.Incubating;
88
import org.hibernate.Internal;
99
import org.hibernate.persister.entity.EntityPersister;
10+
import org.hibernate.spi.NavigablePath;
1011
import org.hibernate.sql.results.graph.entity.EntityInitializer;
1112
import org.hibernate.sql.results.jdbc.spi.JdbcValuesSourceProcessingState;
1213

@@ -22,6 +23,8 @@ public interface EntityHolder {
2223
EntityKey getEntityKey();
2324
EntityPersister getDescriptor();
2425

26+
NavigablePath getNavigablePath();
27+
2528
/**
2629
* The entity object, or {@code null} if no entity object was registered yet.
2730
*/

hibernate-core/src/main/java/org/hibernate/engine/spi/SubselectFetch.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,12 @@
1010
import java.util.Map;
1111
import java.util.Set;
1212

13-
import org.hibernate.internal.util.NullnessUtil;
1413
import org.hibernate.spi.NavigablePath;
1514
import org.hibernate.sql.ast.tree.from.TableGroup;
1615
import org.hibernate.sql.ast.tree.select.QuerySpec;
1716
import org.hibernate.sql.ast.tree.select.SelectStatement;
1817
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
1918
import org.hibernate.sql.exec.spi.JdbcParametersList;
20-
import org.hibernate.sql.results.graph.entity.EntityInitializer;
2119

2220
/**
2321
* Encapsulates details related to entities which contain sub-select-fetchable
@@ -149,14 +147,13 @@ private StandardRegistrationHandler(
149147
public void addKey(EntityHolder holder) {
150148
if ( batchFetchQueue.getSession().getLoadQueryInfluencers()
151149
.hasSubselectLoadableCollections( holder.getDescriptor() ) ) {
152-
final EntityInitializer<?> entityInitializer = NullnessUtil.castNonNull( holder.getEntityInitializer() );
153150
final SubselectFetch subselectFetch = subselectFetches.computeIfAbsent(
154-
entityInitializer.getNavigablePath(),
151+
holder.getNavigablePath(),
155152
navigablePath -> new SubselectFetch(
156153
loadingSqlAst.getQuerySpec(),
157154
loadingSqlAst.getQuerySpec()
158155
.getFromClause()
159-
.findTableGroup( entityInitializer.getNavigablePath() ),
156+
.findTableGroup( holder.getNavigablePath() ),
160157
loadingJdbcParameters,
161158
loadingJdbcParameterBindings,
162159
new HashSet<>()

0 commit comments

Comments
 (0)