From bd3775b1149988a35bf80243d58cda0812f89bab Mon Sep 17 00:00:00 2001 From: Andrea Boriero Date: Thu, 6 Aug 2020 10:31:33 +0100 Subject: [PATCH] PluralAttributeMapping, add associate primary table join only when necessary --- .../internal/PluralAttributeMappingImpl.java | 51 ++++++++++++------- .../sql/ast/tree/from/StandardTableGroup.java | 16 +++--- 2 files changed, 40 insertions(+), 27 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/PluralAttributeMappingImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/PluralAttributeMappingImpl.java index d3e178a312..851bc790f0 100644 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/PluralAttributeMappingImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/mapping/internal/PluralAttributeMappingImpl.java @@ -8,6 +8,7 @@ import java.util.function.BiFunction; import java.util.function.Consumer; +import java.util.function.Function; import java.util.function.Supplier; import org.hibernate.LockMode; @@ -696,7 +697,7 @@ private TableGroup createCollectionTableGroup( creationContext.getSessionFactory() ); - final Consumer tableGroupFinalizer; + final BiFunction tableReferenceJoinCreator; final java.util.function.Predicate tableReferenceJoinNameChecker; if ( elementDescriptor instanceof EntityCollectionPart || indexDescriptor instanceof EntityCollectionPart ) { @@ -715,19 +716,11 @@ private TableGroup createCollectionTableGroup( creationContext ); - tableReferenceJoinNameChecker = mappingType::containsTableReference; - tableReferenceJoinCreator = (tableExpression, tableGroup) -> mappingType.createTableReferenceJoin( - tableExpression, - sqlAliasBase, - associatedPrimaryTable, - canUseInnerJoin && !getAttributeMetadataAccess().resolveAttributeMetadata( null ).isNullable(), - sqlExpressionResolver, - creationContext - ); + final boolean useInnerJoin = canUseInnerJoin && !getAttributeMetadataAccess() + .resolveAttributeMetadata( null ).isNullable(); - tableGroupFinalizer = tableGroup -> { - final SqlAstJoinType joinType = canUseInnerJoin && !getAttributeMetadataAccess().resolveAttributeMetadata( - null ).isNullable() + final Function tableGroupFinalizer = tableGroup -> { + final SqlAstJoinType joinType = useInnerJoin ? SqlAstJoinType.INNER : SqlAstJoinType.LEFT; final TableReferenceJoin associationJoin = new TableReferenceJoin( @@ -741,7 +734,31 @@ private TableGroup createCollectionTableGroup( creationContext ) ); - ( (StandardTableGroup) tableGroup ).addTableReferenceJoin( associationJoin ); + return associationJoin; + }; + + tableReferenceJoinNameChecker = mappingType::containsTableReference; + tableReferenceJoinCreator = (tableExpression, tableGroup) -> { + if ( associatedPrimaryTable.getTableExpression().equals( tableExpression ) ) { + TableReferenceJoin tableReferenceJoin = tableGroupFinalizer.apply( tableGroup ); + return tableReferenceJoin; + } + else { + StandardTableGroup standardTableGroup = (StandardTableGroup) tableGroup; + if ( standardTableGroup.getTableReferenceJoins().isEmpty() ) { + TableReferenceJoin tableReferenceJoin = tableGroupFinalizer.apply( tableGroup ); + standardTableGroup.addTableReferenceJoin( tableReferenceJoin ); + } + + } + return mappingType.createTableReferenceJoin( + tableExpression, + sqlAliasBase, + associatedPrimaryTable, + useInnerJoin, + sqlExpressionResolver, + creationContext + ); }; } else { @@ -751,7 +768,6 @@ private TableGroup createCollectionTableGroup( ); }; tableReferenceJoinNameChecker = s -> false; - tableGroupFinalizer = null; } final StandardTableGroup tableGroup = new StandardTableGroup( @@ -765,13 +781,10 @@ private TableGroup createCollectionTableGroup( creationContext.getSessionFactory() ); - if ( tableGroupFinalizer != null ) { - tableGroupFinalizer.accept( tableGroup ); - } - return tableGroup; } + @Override public TableGroup createRootTableGroup( NavigablePath navigablePath, diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/from/StandardTableGroup.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/from/StandardTableGroup.java index 89891b21fa..313e55d552 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/from/StandardTableGroup.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/from/StandardTableGroup.java @@ -75,6 +75,11 @@ public void applyAffectedTableNames(Consumer nameCollector) { } } + @Override + public TableReference getTableReference(String tableExpression) { + return getTableReferenceInternal( tableExpression ); + } + @Override public TableReference getPrimaryTableReference() { return primaryTableReference; @@ -89,13 +94,12 @@ public void addTableReferenceJoin(TableReferenceJoin join) { if ( tableJoins == null ) { tableJoins = new ArrayList<>(); } - tableJoins.add( join ); } @Override public TableReference getTableReferenceInternal(String tableExpression) { - final TableReference tableReference = super.getTableReferenceInternal( tableExpression ); + TableReference tableReference = primaryTableReference.getTableReference( tableExpression ); if ( tableReference != null ) { return tableReference; } @@ -105,7 +109,7 @@ public TableReference getTableReferenceInternal(String tableExpression) { for ( int i = 0; i < tableJoins.size(); i++ ) { final TableReferenceJoin join = tableJoins.get( i ); assert join != null; - if ( join.getJoinedTableReference().getTableReference( tableExpression ) != null ) { + if ( join.getJoinedTableReference().getTableExpression().equals( tableExpression ) ) { return join.getJoinedTableReference(); } } @@ -128,13 +132,9 @@ public TableReference getTableReferenceInternal(String tableExpression) { protected TableReference potentiallyCreateTableReference(String tableExpression) { final TableReferenceJoin join = tableReferenceJoinCreator.apply( tableExpression, this ); if ( join != null ) { - if ( tableJoins == null ) { - tableJoins = new ArrayList<>(); - } - tableJoins.add( join ); + addTableReferenceJoin( join ); return join.getJoinedTableReference(); } - return null; } }