HHH-15713 UnknownTableReferenceException on @ElementCollection of @Embeddable containing a @MayToOne with a @ManyToMany
This commit is contained in:
parent
1b417126bf
commit
0d20cea0b3
|
@ -19,6 +19,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.results.graph.DomainResult;
|
||||||
import org.hibernate.sql.results.graph.entity.LoadingEntityEntry;
|
import org.hibernate.sql.results.graph.entity.LoadingEntityEntry;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -104,7 +105,7 @@ public class SubselectFetch {
|
||||||
|
|
||||||
return new StandardRegistrationHandler(
|
return new StandardRegistrationHandler(
|
||||||
batchFetchQueue,
|
batchFetchQueue,
|
||||||
sqlAst.getQuerySpec(),
|
sqlAst,
|
||||||
tableGroup,
|
tableGroup,
|
||||||
jdbcParameters,
|
jdbcParameters,
|
||||||
jdbcParameterBindings
|
jdbcParameterBindings
|
||||||
|
@ -137,7 +138,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 QuerySpec loadingSqlAst;
|
private final SelectStatement loadingSqlAst;
|
||||||
private final TableGroup ownerTableGroup;
|
private final TableGroup ownerTableGroup;
|
||||||
private final List<JdbcParameter> loadingJdbcParameters;
|
private final List<JdbcParameter> loadingJdbcParameters;
|
||||||
private final JdbcParameterBindings loadingJdbcParameterBindings;
|
private final JdbcParameterBindings loadingJdbcParameterBindings;
|
||||||
|
@ -145,7 +146,7 @@ public class SubselectFetch {
|
||||||
|
|
||||||
private StandardRegistrationHandler(
|
private StandardRegistrationHandler(
|
||||||
BatchFetchQueue batchFetchQueue,
|
BatchFetchQueue batchFetchQueue,
|
||||||
QuerySpec loadingSqlAst,
|
SelectStatement loadingSqlAst,
|
||||||
TableGroup ownerTableGroup,
|
TableGroup ownerTableGroup,
|
||||||
List<JdbcParameter> loadingJdbcParameters,
|
List<JdbcParameter> loadingJdbcParameters,
|
||||||
JdbcParameterBindings loadingJdbcParameterBindings) {
|
JdbcParameterBindings loadingJdbcParameterBindings) {
|
||||||
|
@ -160,19 +161,39 @@ public class SubselectFetch {
|
||||||
if ( !entry.getDescriptor().hasSubselectLoadableCollections() ) {
|
if ( !entry.getDescriptor().hasSubselectLoadableCollections() ) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
final SubselectFetch subselectFetch = subselectFetches.computeIfAbsent(
|
|
||||||
entry.getEntityInitializer().getNavigablePath(),
|
if ( shouldAddSubselectFetch( entry ) ) {
|
||||||
navigablePath -> new SubselectFetch(
|
final SubselectFetch subselectFetch = subselectFetches.computeIfAbsent(
|
||||||
null,
|
entry.getEntityInitializer().getNavigablePath(),
|
||||||
loadingSqlAst,
|
navigablePath -> new SubselectFetch(
|
||||||
ownerTableGroup,
|
null,
|
||||||
loadingJdbcParameters,
|
loadingSqlAst.getQuerySpec(),
|
||||||
loadingJdbcParameterBindings,
|
ownerTableGroup,
|
||||||
new HashSet<>()
|
loadingJdbcParameters,
|
||||||
)
|
loadingJdbcParameterBindings,
|
||||||
);
|
new HashSet<>()
|
||||||
subselectFetch.resultingEntityKeys.add( key );
|
)
|
||||||
batchFetchQueue.addSubselect( key, subselectFetch );
|
);
|
||||||
|
subselectFetch.resultingEntityKeys.add( key );
|
||||||
|
batchFetchQueue.addSubselect( key, subselectFetch );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean shouldAddSubselectFetch(LoadingEntityEntry entry) {
|
||||||
|
if ( entry.getEntityInitializer().isEntityResultInitializer() ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
final NavigablePath entityInitializerParent = entry.getEntityInitializer().getNavigablePath().getParent();
|
||||||
|
|
||||||
|
// We want to add only the collections of the loading entities
|
||||||
|
for ( DomainResult domainResult : loadingSqlAst.getDomainResultDescriptors() ) {
|
||||||
|
if ( domainResult.getNavigablePath().equals( entityInitializerParent ) ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -464,7 +464,7 @@ public abstract class AbstractEntityInitializer extends AbstractFetchParentAcces
|
||||||
.getEntityInstance();
|
.getEntityInstance();
|
||||||
if ( proxy != null && ( proxy instanceof MapProxy
|
if ( proxy != null && ( proxy instanceof MapProxy
|
||||||
|| entityDescriptor.getJavaType().getJavaTypeClass().isInstance( proxy ) ) ) {
|
|| entityDescriptor.getJavaType().getJavaTypeClass().isInstance( proxy ) ) ) {
|
||||||
if ( this instanceof EntityResultInitializer && entityInstanceFromExecutionContext != null ) {
|
if ( this.isEntityResultInitializer() && entityInstanceFromExecutionContext != null ) {
|
||||||
this.entityInstance = entityInstanceFromExecutionContext;
|
this.entityInstance = entityInstanceFromExecutionContext;
|
||||||
registerLoadingEntity( rowProcessingState, entityInstance );
|
registerLoadingEntity( rowProcessingState, entityInstance );
|
||||||
}
|
}
|
||||||
|
@ -477,7 +477,7 @@ public abstract class AbstractEntityInitializer extends AbstractFetchParentAcces
|
||||||
if ( existingEntity != null ) {
|
if ( existingEntity != null ) {
|
||||||
this.entityInstance = existingEntity;
|
this.entityInstance = existingEntity;
|
||||||
}
|
}
|
||||||
else if ( this instanceof EntityResultInitializer && entityInstanceFromExecutionContext != null ) {
|
else if ( this.isEntityResultInitializer() && entityInstanceFromExecutionContext != null ) {
|
||||||
this.entityInstance = entityInstanceFromExecutionContext;
|
this.entityInstance = entityInstanceFromExecutionContext;
|
||||||
registerLoadingEntity( rowProcessingState, entityInstance );
|
registerLoadingEntity( rowProcessingState, entityInstance );
|
||||||
}
|
}
|
||||||
|
|
|
@ -60,4 +60,8 @@ public interface EntityInitializer extends FetchParentAccess {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
default boolean isEntityResultInitializer() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,4 +56,9 @@ public class EntityResultInitializer extends AbstractEntityInitializer {
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return CONCRETE_NAME + "(" + getNavigablePath() + ")";
|
return CONCRETE_NAME + "(" + getNavigablePath() + ")";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isEntityResultInitializer() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue