Skip to content

Commit 29278a7

Browse files
committed
HHH-18436 Apply plural attribute ordering when creating the join
1 parent 7e0e2f7 commit 29278a7

File tree

5 files changed

+32
-39
lines changed

5 files changed

+32
-39
lines changed

hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSelectBuilder.java

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import org.hibernate.metamodel.mapping.AttributeMapping;
3131
import org.hibernate.metamodel.mapping.CollectionPart;
3232
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
33-
import org.hibernate.metamodel.mapping.EntityMappingType;
3433
import org.hibernate.metamodel.mapping.EntityValuedModelPart;
3534
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
3635
import org.hibernate.metamodel.mapping.ModelPart;
@@ -963,19 +962,6 @@ else if ( fetchDepth > maximumFetchDepth + 1 ) {
963962
creationState
964963
);
965964

966-
if ( fetch.getTiming() == FetchTiming.IMMEDIATE && joined ) {
967-
if ( isFetchablePluralAttributeMapping ) {
968-
final PluralAttributeMapping pluralAttributeMapping = (PluralAttributeMapping) fetchable;
969-
final QuerySpec querySpec = creationState.getInflightQueryPart().getFirstQuerySpec();
970-
applyOrdering(
971-
querySpec,
972-
fetchablePath,
973-
pluralAttributeMapping,
974-
creationState
975-
);
976-
}
977-
}
978-
979965
fetches.add( fetch );
980966
}
981967
finally {
@@ -1010,19 +996,6 @@ else if ( fetchable instanceof PluralAttributeMapping ) {
1010996
return true;
1011997
}
1012998

1013-
private void applyOrdering(
1014-
QuerySpec querySpec,
1015-
NavigablePath navigablePath,
1016-
PluralAttributeMapping pluralAttributeMapping,
1017-
LoaderSqlAstCreationState sqlAstCreationState) {
1018-
assert pluralAttributeMapping.getAttributeName().equals( navigablePath.getLocalName() );
1019-
1020-
final TableGroup tableGroup = sqlAstCreationState.getFromClauseAccess().getTableGroup( navigablePath );
1021-
assert tableGroup != null;
1022-
1023-
applyOrdering( querySpec, tableGroup, pluralAttributeMapping, sqlAstCreationState );
1024-
}
1025-
1026999
private SelectStatement generateSelect(SubselectFetch subselect) {
10271000

10281001
// todo (6.0) : we could even convert this to a join by piecing together

hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSqlAstCreationState.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.hibernate.metamodel.mapping.AssociationKey;
2525
import org.hibernate.metamodel.mapping.ForeignKeyDescriptor;
2626
import org.hibernate.metamodel.mapping.ModelPart;
27+
import org.hibernate.metamodel.mapping.ordering.OrderByFragment;
2728
import org.hibernate.query.spi.Limit;
2829
import org.hibernate.query.sqm.tree.from.SqmFrom;
2930
import org.hibernate.spi.NavigablePath;
@@ -41,8 +42,10 @@
4142
import org.hibernate.sql.ast.spi.SqlAstQueryPartProcessingState;
4243
import org.hibernate.sql.ast.spi.SqlExpressionResolver;
4344
import org.hibernate.sql.ast.tree.from.FromClause;
45+
import org.hibernate.sql.ast.tree.from.TableGroup;
4446
import org.hibernate.sql.ast.tree.predicate.Predicate;
4547
import org.hibernate.sql.ast.tree.select.QueryPart;
48+
import org.hibernate.sql.ast.tree.select.QuerySpec;
4649
import org.hibernate.sql.results.graph.DomainResultCreationState;
4750
import org.hibernate.sql.results.graph.FetchParent;
4851
import org.hibernate.sql.results.graph.internal.ImmutableFetchList;
@@ -94,6 +97,13 @@ public LoaderSqlAstCreationState(
9497
);
9598
}
9699

100+
@Override
101+
public void applyOrdering(TableGroup tableGroup, OrderByFragment orderByFragment) {
102+
final QuerySpec querySpec = getInflightQueryPart().getFirstQuerySpec();
103+
assert querySpec.isRoot() : "Illegal attempt to apply order-by fragment to a non-root query spec";
104+
orderByFragment.apply( querySpec, tableGroup, this );
105+
}
106+
97107
@Override
98108
public SqlAstCreationContext getCreationContext() {
99109
return sf;

hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/PluralAttributeMappingImpl.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -738,6 +738,16 @@ public TableGroupJoin createTableGroupJoin(
738738
creationState
739739
);
740740

741+
if ( fetched ) {
742+
if ( orderByFragment != null ) {
743+
creationState.applyOrdering( tableGroup, orderByFragment );
744+
}
745+
746+
if ( manyToManyOrderByFragment != null ) {
747+
creationState.applyOrdering( tableGroup, manyToManyOrderByFragment );
748+
}
749+
}
750+
741751
final TableGroupJoin tableGroupJoin = new TableGroupJoin(
742752
navigablePath,
743753
determineSqlJoinType( lhs, requestedJoinType, fetched ),

hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8552,14 +8552,6 @@ public <R> R withNestedFetchParent(FetchParent fetchParent, Function<FetchParent
85528552

85538553
@Override
85548554
public ImmutableFetchList visitFetches(FetchParent fetchParent) {
8555-
if ( fetchParent instanceof EagerCollectionFetch && currentQuerySpec().isRoot() ) {
8556-
final EagerCollectionFetch collectionFetch = (EagerCollectionFetch) fetchParent;
8557-
final PluralAttributeMapping pluralAttributeMapping = collectionFetch.getFetchedMapping();
8558-
final NavigablePath fetchablePath = collectionFetch.getNavigablePath();
8559-
final TableGroup tableGroup = getFromClauseIndex().getTableGroup( fetchablePath );
8560-
assert tableGroup.getModelPart() == pluralAttributeMapping;
8561-
applyOrdering( tableGroup, pluralAttributeMapping );
8562-
}
85638555
final FetchableContainer referencedMappingContainer = fetchParent.getReferencedMappingContainer();
85648556
final int keySize = referencedMappingContainer.getNumberOfKeyFetchables();
85658557
final int size = referencedMappingContainer.getNumberOfFetchables();
@@ -8646,11 +8638,14 @@ private void applyOrdering(TableGroup tableGroup, PluralAttributeMapping pluralA
86468638
}
86478639
}
86488640

8649-
private void applyOrdering(TableGroup tableGroup, OrderByFragment orderByFragment) {
8650-
if ( orderByFragments == null ) {
8651-
orderByFragments = new ArrayList<>();
8641+
@Override
8642+
public void applyOrdering(TableGroup tableGroup, OrderByFragment orderByFragment) {
8643+
if ( currentQuerySpec().isRoot() ) {
8644+
if ( orderByFragments == null ) {
8645+
orderByFragments = new ArrayList<>();
8646+
}
8647+
orderByFragments.add( new AbstractMap.SimpleEntry<>( orderByFragment, tableGroup ) );
86528648
}
8653-
orderByFragments.add( new AbstractMap.SimpleEntry<>( orderByFragment, tableGroup ) );
86548649
}
86558650

86568651
@Override

hibernate-core/src/main/java/org/hibernate/sql/ast/spi/SqlAstCreationState.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.hibernate.Internal;
1010
import org.hibernate.LockMode;
1111
import org.hibernate.engine.spi.LoadQueryInfluencers;
12+
import org.hibernate.metamodel.mapping.ordering.OrderByFragment;
1213
import org.hibernate.persister.entity.EntityNameUse;
1314
import org.hibernate.sql.ast.tree.from.TableGroup;
1415

@@ -49,4 +50,8 @@ default void registerEntityNameUsage(
4950
default boolean supportsEntityNameUsage() {
5051
return false;
5152
}
53+
54+
@Internal
55+
default void applyOrdering(TableGroup tableGroup, OrderByFragment orderByFragment) {
56+
}
5257
}

0 commit comments

Comments
 (0)