diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java index 52aee4bc2121..78a1f6f249a8 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/BaseSqmToSqlAstConverter.java @@ -3755,12 +3755,23 @@ protected Expression createLateralJoinExpression( creationContext ) ); + final String compatibleTableExpression; + if ( modelPart instanceof BasicValuedModelPart ) { + compatibleTableExpression = ( (BasicValuedModelPart) modelPart ).getContainingTableExpression(); + } + else if ( modelPart instanceof EmbeddableValuedModelPart ) { + compatibleTableExpression = ( (EmbeddableValuedModelPart) modelPart ).getContainingTableExpression(); + } + else { + compatibleTableExpression = null; + } lateralTableGroup = new QueryPartTableGroup( queryPath, null, subQuerySpec, identifierVariable, columnNames, + compatibleTableExpression, true, false, creationContext.getSessionFactory() @@ -3801,7 +3812,12 @@ protected Expression createLateralJoinExpression( } parentFromClauseAccess.registerTableGroup( lateralTableGroup.getNavigablePath(), lateralTableGroup ); if ( jdbcTypeCount == 1 ) { - return resultColumnReferences.get( 0 ); + return new BasicValuedPathInterpretation<>( + resultColumnReferences.get( 0 ), + queryPath, + (BasicValuedModelPart) modelPart, + lateralTableGroup + ); } else { return new SqlTuple( resultColumnReferences, modelPart ); @@ -3813,7 +3829,8 @@ protected Expression createLateralJoinExpression( } final QueryPartTableReference tableReference = (QueryPartTableReference) lateralTableGroup.getPrimaryTableReference(); if ( jdbcTypeCount == 1 ) { - return new ColumnReference( + return new BasicValuedPathInterpretation<>( + new ColumnReference( identifierVariable, tableReference.getColumnNames().get( 0 ), false, @@ -3821,6 +3838,10 @@ protected Expression createLateralJoinExpression( null, modelPart.getJdbcMappings().get( 0 ), creationContext.getSessionFactory() + ), + queryPath, + (BasicValuedModelPart) modelPart, + lateralTableGroup ); } else { diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/from/QueryPartTableGroup.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/from/QueryPartTableGroup.java index 3009f15af683..5a947a05c5c7 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/from/QueryPartTableGroup.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/from/QueryPartTableGroup.java @@ -8,6 +8,7 @@ import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.function.Consumer; import org.hibernate.engine.spi.SessionFactoryImplementor; @@ -22,6 +23,7 @@ public class QueryPartTableGroup extends AbstractTableGroup { private final QueryPartTableReference queryPartTableReference; + private final String compatibleTableExpression; public QueryPartTableGroup( NavigablePath navigablePath, @@ -32,6 +34,28 @@ public QueryPartTableGroup( boolean lateral, boolean canUseInnerJoins, SessionFactoryImplementor sessionFactory) { + this( + navigablePath, + tableGroupProducer, + queryPart, + sourceAlias, + columnNames, + null, + lateral, + canUseInnerJoins, + sessionFactory + ); + } + + public QueryPartTableGroup( + NavigablePath navigablePath, + TableGroupProducer tableGroupProducer, + QueryPart queryPart, + String sourceAlias, + List columnNames, + String compatibleTableExpression, boolean lateral, + boolean canUseInnerJoins, + SessionFactoryImplementor sessionFactory) { super( canUseInnerJoins, navigablePath, @@ -40,6 +64,7 @@ public QueryPartTableGroup( null, sessionFactory ); + this.compatibleTableExpression = compatibleTableExpression; this.queryPartTableReference = new QueryPartTableReference( queryPart, sourceAlias, @@ -60,7 +85,7 @@ protected TableReference getTableReferenceInternal( String tableExpression, boolean allowFkOptimization, boolean resolve) { - if ( tableExpression == null ) { + if ( Objects.equals( tableExpression, compatibleTableExpression ) ) { return getPrimaryTableReference(); } for ( TableGroupJoin tableGroupJoin : getNestedTableGroupJoins() ) { diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/FunctionTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/FunctionTests.java index 24e3053aa289..febbb8284611 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/FunctionTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/FunctionTests.java @@ -9,11 +9,8 @@ import org.hibernate.QueryException; import org.hibernate.dialect.DerbyDialect; -import org.hibernate.dialect.H2Dialect; -import org.hibernate.dialect.HSQLDialect; import org.hibernate.dialect.MariaDBDialect; import org.hibernate.dialect.MySQLDialect; -import org.hibernate.dialect.SybaseDialect; import org.hibernate.dialect.TiDBDialect; import org.hibernate.testing.orm.domain.StandardDomainModel; import org.hibernate.testing.orm.domain.gambit.EntityOfBasics; @@ -94,14 +91,6 @@ public void testIdVersionFunctions(SessionFactoryScope scope) { } @Test - @RequiresDialect(H2Dialect.class) - @RequiresDialect(HSQLDialect.class) - @RequiresDialect(DerbyDialect.class) - @RequiresDialect(MySQLDialect.class) - @RequiresDialect(SybaseDialect.class) - @RequiresDialect(MariaDBDialect.class) - @RequiresDialect(TiDBDialect.class) - // it's failing on the other dialects due to a bug in query translator public void testMaxMinSumIndexElement(SessionFactoryScope scope) { scope.inTransaction( session -> { @@ -133,14 +122,6 @@ public void testMaxMinSumIndexElement(SessionFactoryScope scope) { } @Test - @RequiresDialect(H2Dialect.class) - @RequiresDialect(HSQLDialect.class) - @RequiresDialect(DerbyDialect.class) - @RequiresDialect(MySQLDialect.class) - @RequiresDialect(SybaseDialect.class) - @RequiresDialect(MariaDBDialect.class) - @RequiresDialect(TiDBDialect.class) - // it's failing on the other dialects due to a bug in query translator public void testMaxindexMaxelement(SessionFactoryScope scope) { scope.inTransaction( session -> {