From 5a2f92588c4fb495376500ade19669133593caad Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Thu, 24 Mar 2022 06:55:09 +0100 Subject: [PATCH] Do not reuse join that is treat joined --- .../internal/QualifiedJoinPathConsumer.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/query/hql/internal/QualifiedJoinPathConsumer.java b/hibernate-core/src/main/java/org/hibernate/query/hql/internal/QualifiedJoinPathConsumer.java index e8888a6bbd..17e3d054ef 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/hql/internal/QualifiedJoinPathConsumer.java +++ b/hibernate-core/src/main/java/org/hibernate/query/hql/internal/QualifiedJoinPathConsumer.java @@ -10,11 +10,11 @@ import org.hibernate.query.SemanticException; import org.hibernate.query.hql.spi.DotIdentifierConsumer; import org.hibernate.query.hql.spi.SemanticPathPart; +import org.hibernate.query.hql.spi.SqmCreationProcessingState; +import org.hibernate.query.hql.spi.SqmCreationState; import org.hibernate.query.hql.spi.SqmPathRegistry; import org.hibernate.query.sqm.SqmJoinable; import org.hibernate.query.sqm.SqmPathSource; -import org.hibernate.query.hql.spi.SqmCreationProcessingState; -import org.hibernate.query.hql.spi.SqmCreationState; import org.hibernate.query.sqm.spi.SqmCreationHelper; import org.hibernate.query.sqm.tree.SqmJoinType; import org.hibernate.query.sqm.tree.domain.SqmPolymorphicRootDescriptor; @@ -96,7 +96,7 @@ public void consumeIdentifier(String identifier, boolean isBase, boolean isTermi } else { assert delegate != null; - delegate.consumeIdentifier( identifier, !nested && isTerminal ); + delegate.consumeIdentifier( identifier, !nested && isTerminal, !( nested && isTerminal ) ); } } @@ -160,6 +160,7 @@ private ConsumerDelegate resolveBase(String identifier, boolean isTerminal) { alias, fetch, isTerminal, + true, creationState ); } @@ -171,10 +172,11 @@ private static SqmFrom createJoin( String alias, boolean fetch, boolean isTerminal, + boolean allowReuse, SqmCreationState creationState) { //noinspection unchecked final SqmPathSource subPathSource = (SqmPathSource) lhs.getReferencedPathSource().getSubPathSource( name ); - if ( !isTerminal ) { + if ( allowReuse && !isTerminal ) { for ( SqmJoin sqmJoin : lhs.getSqmJoins() ) { if ( sqmJoin.getAlias() == null && sqmJoin.getReferencedPathSource() == subPathSource ) { //noinspection unchecked @@ -186,7 +188,7 @@ private static SqmFrom createJoin( final SqmJoin join = ( (SqmJoinable) subPathSource ).createSqmJoin( lhs, joinType, - isTerminal ? alias : SqmCreationHelper.IMPLICIT_ALIAS, + isTerminal ? alias : allowReuse ? SqmCreationHelper.IMPLICIT_ALIAS : Long.toString( System.nanoTime() ), fetch, creationState ); @@ -196,7 +198,7 @@ private static SqmFrom createJoin( } private interface ConsumerDelegate { - void consumeIdentifier(String identifier, boolean isTerminal); + void consumeIdentifier(String identifier, boolean isTerminal, boolean allowReuse); void consumeTreat(String entityName, boolean isTerminal); SemanticPathPart getConsumedPart(); } @@ -226,7 +228,7 @@ public AttributeJoinDelegate( } @Override - public void consumeIdentifier(String identifier, boolean isTerminal) { + public void consumeIdentifier(String identifier, boolean isTerminal, boolean allowReuse) { currentPath = createJoin( currentPath, identifier, @@ -234,6 +236,7 @@ public void consumeIdentifier(String identifier, boolean isTerminal) { alias, fetch, isTerminal, + allowReuse, creationState ); } @@ -283,11 +286,11 @@ public ExpectingEntityJoinDelegate( this.fetch = fetch; this.alias = alias; - consumeIdentifier( identifier, isTerminal ); + consumeIdentifier( identifier, isTerminal, true ); } @Override - public void consumeIdentifier(String identifier, boolean isTerminal) { + public void consumeIdentifier(String identifier, boolean isTerminal, boolean allowReuse) { if ( path.length() != 0 ) { path.append( '.' ); }