package org.hibernate.loader.plan.exec.internal;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.loader.plan.exec.query.internal.SelectStatementBuilder;
import org.hibernate.loader.plan.exec.query.spi.QueryBuildingParameters;
import org.hibernate.loader.plan.exec.spi.EntityReferenceAliases;
import org.hibernate.loader.plan.exec.spi.LoadQueryDetails;
import org.hibernate.loader.plan.spi.CollectionReturn;
import org.hibernate.loader.plan.spi.EntityReference;
import org.hibernate.loader.plan.spi.LoadPlan;
import org.hibernate.persister.entity.OuterJoinLoadable;
public class OneToManyLoadQueryDetails extends AbstractCollectionLoadQueryDetails {
OneToManyLoadQueryDetails(
LoadPlan loadPlan,
AliasResolutionContextImpl aliasResolutionContext,
CollectionReturn rootReturn,
QueryBuildingParameters buildingParameters,
SessionFactoryImplementor factory) {
super(
loadPlan,
aliasResolutionContext,
rootReturn,
buildingParameters,
factory
);
generate();
}
@Override
protected String getRootTableAlias() {
return getElementEntityReferenceAliases().getTableAlias();
}
@Override
protected void applyRootReturnSelectFragments(SelectStatementBuilder selectStatementBuilder) {
selectStatementBuilder.appendSelectClauseFragment(
getQueryableCollection().selectFragment(
null,
null,
getElementEntityReferenceAliases().getTableAlias(),
getElementEntityReferenceAliases().getColumnAliases().getSuffix(),
getCollectionReferenceAliases().getCollectionColumnAliases().getSuffix(),
true
)
);
super.applyRootReturnSelectFragments( selectStatementBuilder );
}
@Override
protected void applyRootReturnTableFragments(SelectStatementBuilder selectStatementBuilder) {
final OuterJoinLoadable elementOuterJoinLoadable =
(OuterJoinLoadable) getElementEntityReference().getEntityPersister();
final String tableAlias = getElementEntityReferenceAliases().getTableAlias();
final String fragment =
elementOuterJoinLoadable.fromTableFragment( tableAlias ) +
elementOuterJoinLoadable.fromJoinFragment( tableAlias, true, true);
selectStatementBuilder.appendFromClauseFragment( fragment );
}
private EntityReference getElementEntityReference() {
return getRootCollectionReturn().getElementGraph().resolveEntityReference();
}
private EntityReferenceAliases getElementEntityReferenceAliases() {
return getAliasResolutionContext().resolveEntityReferenceAliases( getElementEntityReference().getQuerySpaceUid() );
}
}