Fix issue with SimpleForeignKeyDescriptor DomainResult creation
This commit is contained in:
parent
681c3fa9cf
commit
52b126d4cf
|
@ -25,7 +25,15 @@ public interface ForeignKeyDescriptor extends VirtualModelPart {
|
|||
|
||||
ForeignKeyDirection getDirection();
|
||||
|
||||
DomainResult createDomainResult(NavigablePath collectionPath, TableGroup tableGroup, DomainResultCreationState creationState);
|
||||
DomainResult createCollectionFecthDomainResult(
|
||||
NavigablePath collectionPath,
|
||||
TableGroup tableGroup,
|
||||
DomainResultCreationState creationState);
|
||||
|
||||
DomainResult createDomainResult(
|
||||
NavigablePath collectionPath,
|
||||
TableGroup tableGroup,
|
||||
DomainResultCreationState creationState);
|
||||
|
||||
Predicate generateJoinPredicate(
|
||||
TableGroup lhs,
|
||||
|
|
|
@ -87,6 +87,46 @@ public class SimpleForeignKeyDescriptor implements ForeignKeyDescriptor, BasicVa
|
|||
return fKeyDirection;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DomainResult createCollectionFecthDomainResult(
|
||||
NavigablePath collectionPath,
|
||||
TableGroup tableGroup,
|
||||
DomainResultCreationState creationState) {
|
||||
if ( targetColumnContainingTable.equals( keyColumnContainingTable ) ) {
|
||||
final SqlAstCreationState sqlAstCreationState = creationState.getSqlAstCreationState();
|
||||
final SqlExpressionResolver sqlExpressionResolver = sqlAstCreationState.getSqlExpressionResolver();
|
||||
final TableReference tableReference = tableGroup.resolveTableReference( keyColumnContainingTable );
|
||||
final String identificationVariable = tableReference.getIdentificationVariable();
|
||||
final SqlSelection sqlSelection = sqlExpressionResolver.resolveSqlSelection(
|
||||
sqlExpressionResolver.resolveSqlExpression(
|
||||
SqlExpressionResolver.createColumnReferenceKey(
|
||||
tableReference,
|
||||
targetColumnExpression
|
||||
),
|
||||
s -> {
|
||||
return new ColumnReference(
|
||||
identificationVariable,
|
||||
targetColumnExpression,
|
||||
jdbcMapping,
|
||||
creationState.getSqlAstCreationState().getCreationContext().getSessionFactory()
|
||||
);
|
||||
}
|
||||
),
|
||||
jdbcMapping.getJavaTypeDescriptor(),
|
||||
sqlAstCreationState.getCreationContext().getDomainModel().getTypeConfiguration()
|
||||
);
|
||||
|
||||
//noinspection unchecked
|
||||
return new BasicResult(
|
||||
sqlSelection.getValuesArrayPosition(),
|
||||
null,
|
||||
jdbcMapping.getJavaTypeDescriptor()
|
||||
);
|
||||
}else {
|
||||
return createDomainResult( collectionPath, tableGroup, creationState );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public DomainResult createDomainResult(
|
||||
NavigablePath collectionPath,
|
||||
|
|
|
@ -177,6 +177,11 @@ public abstract class AbstractCollectionInitializer implements CollectionInitial
|
|||
LoggingHelper.toLoggableString( getNavigablePath(), this.collectionKey.getKey() )
|
||||
);
|
||||
}
|
||||
}else {
|
||||
this.collectionKey = new CollectionKey(
|
||||
collectionAttributeMapping.getCollectionDescriptor(),
|
||||
parentAccess.getParentKey()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -61,13 +61,13 @@ public class EagerCollectionFetch extends CollectionFetch implements FetchParent
|
|||
final ForeignKeyDescriptor keyDescriptor = fetchedAttribute.getKeyDescriptor();
|
||||
if ( parentTableGroup != null ) {
|
||||
// join fetch
|
||||
keyContainerResult = keyDescriptor.createDomainResult( fetchedPath, parentTableGroup, creationState );
|
||||
keyContainerResult = keyDescriptor.createCollectionFecthDomainResult( fetchedPath, parentTableGroup, creationState );
|
||||
keyCollectionResult = keyDescriptor.createDomainResult( fetchedPath, collectionTableGroup, creationState );
|
||||
}
|
||||
else {
|
||||
// select fetch
|
||||
// todo (6.0) : we could potentially leverage batch fetching for performance
|
||||
keyContainerResult = keyDescriptor.createDomainResult( fetchedPath, collectionTableGroup, creationState );
|
||||
keyContainerResult = keyDescriptor.createCollectionFecthDomainResult( fetchedPath, collectionTableGroup, creationState );
|
||||
|
||||
// use null for `keyCollectionResult`... the initializer will see that as trigger to use
|
||||
// the assembled container-key value as the collection-key value.
|
||||
|
|
Loading…
Reference in New Issue