diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixDialect.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixDialect.java index 7ba92005fc..368ba500d0 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixDialect.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixDialect.java @@ -196,14 +196,16 @@ public class InformixDialect extends Dialect { DomainParameterXref domainParameterXref, QueryParameterBindings domainParameterBindings, LoadQueryInfluencers loadQueryInfluencers, - SqlAstCreationContext creationContext) { + SqlAstCreationContext creationContext, + boolean deduplicateSelectionItems) { return new InformixSqmToSqlAstConverter<>( sqmSelectStatement, queryOptions, domainParameterXref, domainParameterBindings, loadQueryInfluencers, - creationContext + creationContext, + deduplicateSelectionItems ); } }; diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixSqmToSqlAstConverter.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixSqmToSqlAstConverter.java index 9dbf1e0490..de89fe0fa8 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixSqmToSqlAstConverter.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/InformixSqmToSqlAstConverter.java @@ -37,8 +37,17 @@ public class InformixSqmToSqlAstConverter extends BaseSqmTo DomainParameterXref domainParameterXref, QueryParameterBindings domainParameterBindings, LoadQueryInfluencers fetchInfluencers, - SqlAstCreationContext creationContext) { - super( creationContext, statement, queryOptions, fetchInfluencers, domainParameterXref, domainParameterBindings ); + SqlAstCreationContext creationContext, + boolean deduplicateSelectionItems) { + super( + creationContext, + statement, + queryOptions, + fetchInfluencers, + domainParameterXref, + domainParameterBindings, + deduplicateSelectionItems + ); } @Override diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/IngresDialect.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/IngresDialect.java index 289092af00..49c806f9df 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/IngresDialect.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/IngresDialect.java @@ -311,14 +311,16 @@ public class IngresDialect extends Dialect { DomainParameterXref domainParameterXref, QueryParameterBindings domainParameterBindings, LoadQueryInfluencers loadQueryInfluencers, - SqlAstCreationContext creationContext) { + SqlAstCreationContext creationContext, + boolean deduplicateSelectionItems) { return new IngresSqmToSqlAstConverter<>( sqmSelectStatement, queryOptions, domainParameterXref, domainParameterBindings, loadQueryInfluencers, - creationContext + creationContext, + deduplicateSelectionItems ); } }; diff --git a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/IngresSqmToSqlAstConverter.java b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/IngresSqmToSqlAstConverter.java index 0d00d5318c..ff472769c5 100644 --- a/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/IngresSqmToSqlAstConverter.java +++ b/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/IngresSqmToSqlAstConverter.java @@ -37,8 +37,17 @@ public class IngresSqmToSqlAstConverter extends BaseSqmToSq DomainParameterXref domainParameterXref, QueryParameterBindings domainParameterBindings, LoadQueryInfluencers fetchInfluencers, - SqlAstCreationContext creationContext) { - super( creationContext, statement, queryOptions, fetchInfluencers, domainParameterXref, domainParameterBindings ); + SqlAstCreationContext creationContext, + boolean deduplicateSelectionItems) { + super( + creationContext, + statement, + queryOptions, + fetchInfluencers, + domainParameterXref, + domainParameterBindings, + deduplicateSelectionItems + ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/SybaseDialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/SybaseDialect.java index bf8eb5f2cc..c596d41839 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/SybaseDialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/SybaseDialect.java @@ -123,14 +123,16 @@ public class SybaseDialect extends AbstractTransactSQLDialect { DomainParameterXref domainParameterXref, QueryParameterBindings domainParameterBindings, LoadQueryInfluencers loadQueryInfluencers, - SqlAstCreationContext creationContext) { + SqlAstCreationContext creationContext, + boolean deduplicateSelectionItems) { return new SybaseSqmToSqlAstConverter<>( sqmSelectStatement, queryOptions, domainParameterXref, domainParameterBindings, loadQueryInfluencers, - creationContext + creationContext, + deduplicateSelectionItems ); } }; diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/SybaseSqmToSqlAstConverter.java b/hibernate-core/src/main/java/org/hibernate/dialect/SybaseSqmToSqlAstConverter.java index 9913f76f43..4acee8e666 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/SybaseSqmToSqlAstConverter.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/SybaseSqmToSqlAstConverter.java @@ -37,8 +37,17 @@ public class SybaseSqmToSqlAstConverter extends BaseSqmToSq DomainParameterXref domainParameterXref, QueryParameterBindings domainParameterBindings, LoadQueryInfluencers fetchInfluencers, - SqlAstCreationContext creationContext) { - super( creationContext, statement, queryOptions, fetchInfluencers, domainParameterXref, domainParameterBindings ); + SqlAstCreationContext creationContext, + boolean deduplicateSelectionItems) { + super( + creationContext, + statement, + queryOptions, + fetchInfluencers, + domainParameterXref, + domainParameterBindings, + deduplicateSelectionItems + ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSqlAstCreationState.java b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSqlAstCreationState.java index 20b8875580..5e5db01d78 100644 --- a/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSqlAstCreationState.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/ast/internal/LoaderSqlAstCreationState.java @@ -78,7 +78,8 @@ public class LoaderSqlAstCreationState queryPart, this, this, - () -> Clause.IRRELEVANT + () -> Clause.IRRELEVANT, + true ); } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java index 046b9a1697..3391ab20f4 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/internal/ConcreteSqmSelectQueryPlan.java @@ -365,7 +365,8 @@ public class ConcreteSqmSelectQueryPlan implements SelectQueryPlan { domainParameterXref, executionContext.getQueryParameterBindings(), executionContext.getSession().getLoadQueryInfluencers(), - sessionFactory + sessionFactory, + true ); // tableGroupAccess = sqmConverter.getFromClauseAccess(); diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/MatchingIdSelectionHelper.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/MatchingIdSelectionHelper.java index 50ecb53e0f..e3a6cd6fdb 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/MatchingIdSelectionHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/MatchingIdSelectionHelper.java @@ -96,7 +96,8 @@ public class MatchingIdSelectionHelper { idSelectionQuery, sqmConverter.getCurrentProcessingState(), sqmConverter.getSqlAstCreationState(), - sqmConverter.getCurrentClauseStack()::getCurrent + sqmConverter.getCurrentClauseStack()::getCurrent, + false ) ); targetEntityDescriptor.getIdentifierMapping().applySqlSelections( @@ -240,7 +241,8 @@ public class MatchingIdSelectionHelper { matchingIdSelection.getQuerySpec(), sqmConverter.getCurrentProcessingState(), sqmConverter.getSqlAstCreationState(), - sqmConverter.getCurrentClauseStack()::getCurrent + sqmConverter.getCurrentClauseStack()::getCurrent, + true ) ); entityDescriptor.visitSubTypeAttributeMappings( diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/MultiTableSqmMutationConverter.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/MultiTableSqmMutationConverter.java index bfc21c2679..45cbb3d4cc 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/MultiTableSqmMutationConverter.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/MultiTableSqmMutationConverter.java @@ -20,15 +20,12 @@ import org.hibernate.query.spi.QueryOptions; import org.hibernate.query.spi.QueryParameterBindings; import org.hibernate.query.sqm.internal.DomainParameterXref; import org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter; -import org.hibernate.query.sqm.sql.internal.DomainResultProducer; import org.hibernate.query.sqm.sql.internal.SqlAstProcessingStateImpl; -import org.hibernate.query.sqm.sql.internal.SqlAstQueryPartProcessingStateImpl; import org.hibernate.query.sqm.tree.SqmStatement; import org.hibernate.query.sqm.tree.expression.SqmParameter; import org.hibernate.query.sqm.tree.from.SqmRoot; import org.hibernate.query.sqm.tree.insert.SqmInsertStatement; import org.hibernate.query.sqm.tree.predicate.SqmWhereClause; -import org.hibernate.query.sqm.tree.select.SqmSelectClause; import org.hibernate.query.sqm.tree.update.SqmAssignment; import org.hibernate.query.sqm.tree.update.SqmSetClause; import org.hibernate.sql.ast.spi.SqlAstCreationContext; @@ -40,7 +37,6 @@ import org.hibernate.sql.ast.tree.expression.Expression; import org.hibernate.sql.ast.tree.expression.JdbcParameter; import org.hibernate.sql.ast.tree.from.TableGroup; import org.hibernate.sql.ast.tree.predicate.Predicate; -import org.hibernate.sql.ast.tree.select.QuerySpec; import org.hibernate.sql.ast.tree.update.Assignable; import org.hibernate.sql.ast.tree.update.Assignment; @@ -51,7 +47,6 @@ import org.hibernate.sql.ast.tree.update.Assignment; * * @see #visitSetClause(SqmSetClause, Consumer, SqmParameterResolutionConsumer) * @see #visitWhereClause(SqmWhereClause, Consumer, SqmParameterResolutionConsumer) - * @see #visitSelectClause(SqmSelectClause, QuerySpec, Consumer, SqmParameterResolutionConsumer) * * @author Steve Ebersole */ @@ -97,7 +92,15 @@ public class MultiTableSqmMutationConverter extends BaseSqmToSqlAstConverter columnReferenceConsumer, - SqmParameterResolutionConsumer parameterResolutionConsumer) { - assert sqmSelectClause != null; - - this.parameterResolutionConsumer = parameterResolutionConsumer; - - final SqlAstProcessingState rootProcessingState = getCurrentProcessingState(); - final SqlAstProcessingStateImpl processingState = new SqlAstQueryPartProcessingStateImpl( - sqlQuerySpec, - rootProcessingState, - this, - r -> new SqmAliasedNodePositionTracker( - r, - sqmSelectClause.getSelections() - ), - getCurrentClauseStack()::getCurrent - ) { - @Override - public SqlExpressionResolver getSqlExpressionResolver() { - return this; - } - - @Override - public Expression resolveSqlExpression( - String key, Function creator) { - final Expression expression = rootProcessingState.getSqlExpressionResolver().resolveSqlExpression( - key, - creator - ); - if ( expression instanceof ColumnReference ) { - columnReferenceConsumer.accept( (ColumnReference) expression ); - } - return expression; - } - }; - - pushProcessingState( processingState, getFromClauseIndex() ); - try { - for ( int i = 0; i < sqmSelectClause.getSelectionItems().size(); i++ ) { - final DomainResultProducer domainResultProducer = (DomainResultProducer) sqmSelectClause.getSelectionItems() - .get( i ) - .accept( this ); - domainResultProducer.applySqlSelections( this ); - } - } - finally { - popProcessingStateStack(); - this.parameterResolutionConsumer = null; - } - } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteDeleteHandler.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteDeleteHandler.java index d5aa364e0e..3f0f189634 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteDeleteHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/mutation/internal/cte/CteDeleteHandler.java @@ -63,7 +63,8 @@ public class CteDeleteHandler extends AbstractCteMutationHandler implements Dele idSelectStatement.getQuerySpec(), sqmConverter.getCurrentProcessingState(), sqmConverter.getSqlAstCreationState(), - sqmConverter.getCurrentClauseStack()::getCurrent + sqmConverter.getCurrentClauseStack()::getCurrent, + false ) ); getEntityDescriptor().visitSubTypeAttributeMappings( 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 4a07b2acfe..23f41cce35 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 @@ -395,6 +395,7 @@ public abstract class BaseSqmToSqlAstConverter extends Base private int fetchDepth; private String currentBagRole; private boolean resolvingCircularFetch; + private boolean deduplicateSelectionItems; private ForeignKeyDescriptor.Nature currentlyResolvingForeignKeySide; private SqmQueryPart currentSqmQueryPart; private boolean containsCollectionFetches; @@ -423,7 +424,8 @@ public abstract class BaseSqmToSqlAstConverter extends Base QueryOptions queryOptions, LoadQueryInfluencers loadQueryInfluencers, DomainParameterXref domainParameterXref, - QueryParameterBindings domainParameterBindings) { + QueryParameterBindings domainParameterBindings, + boolean deduplicateSelectionItems) { super( creationContext.getServiceRegistry() ); this.creationContext = creationContext; @@ -434,6 +436,7 @@ public abstract class BaseSqmToSqlAstConverter extends Base .isJpaQueryComplianceEnabled(); this.statement = statement; + this.deduplicateSelectionItems = deduplicateSelectionItems; if ( statement instanceof SqmSelectStatement ) { // NOTE: note the difference here between `JpaSelection#getSelectionItems` @@ -1586,7 +1589,8 @@ public abstract class BaseSqmToSqlAstConverter extends Base getCurrentProcessingState(), this, DelegatingSqmAliasedNodeCollector::new, - currentClauseStack::getCurrent + currentClauseStack::getCurrent, + deduplicateSelectionItems ); final DelegatingSqmAliasedNodeCollector collector = (DelegatingSqmAliasedNodeCollector) processingState .getSqlExpressionResolver(); @@ -1656,7 +1660,8 @@ public abstract class BaseSqmToSqlAstConverter extends Base r, selectClause.getSelections() ), - currentClauseStack::getCurrent + currentClauseStack::getCurrent, + deduplicateSelectionItems ); } else { @@ -1664,12 +1669,16 @@ public abstract class BaseSqmToSqlAstConverter extends Base sqlQuerySpec, getCurrentProcessingState(), this, - currentClauseStack::getCurrent + currentClauseStack::getCurrent, + deduplicateSelectionItems ); } final SqmQueryPart sqmQueryPart = currentSqmQueryPart; + final boolean originalDeduplicateSelectionItems = deduplicateSelectionItems; currentSqmQueryPart = sqmQuerySpec; + // In sub-queries, we can never deduplicate the selection items as that might change semantics + deduplicateSelectionItems = false; pushProcessingState( processingState ); try { @@ -1719,6 +1728,7 @@ public abstract class BaseSqmToSqlAstConverter extends Base additionalRestrictions = originalAdditionalRestrictions; popProcessingStateStack(); currentSqmQueryPart = sqmQueryPart; + deduplicateSelectionItems = originalDeduplicateSelectionItems; } } @@ -3370,7 +3380,8 @@ public abstract class BaseSqmToSqlAstConverter extends Base subQuerySpec, getCurrentProcessingState(), this, - currentClauseStack::getCurrent + currentClauseStack::getCurrent, + false ) ); try { @@ -3518,7 +3529,8 @@ public abstract class BaseSqmToSqlAstConverter extends Base subQuerySpec, getCurrentProcessingState(), this, - currentClauseStack::getCurrent + currentClauseStack::getCurrent, + false ) ); try { @@ -3646,7 +3658,8 @@ public abstract class BaseSqmToSqlAstConverter extends Base subQuerySpec, getCurrentProcessingState(), this, - currentClauseStack::getCurrent + currentClauseStack::getCurrent, + false ) ); try { @@ -5365,7 +5378,8 @@ public abstract class BaseSqmToSqlAstConverter extends Base subQuerySpec, getCurrentProcessingState(), this, - currentClauseStack::getCurrent + currentClauseStack::getCurrent, + false ) ); try { diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/SqmTranslatorFactory.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/SqmTranslatorFactory.java index 42a3e8ce7c..f8ebb2dbd8 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/SqmTranslatorFactory.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/SqmTranslatorFactory.java @@ -31,7 +31,8 @@ public interface SqmTranslatorFactory { DomainParameterXref domainParameterXref, QueryParameterBindings domainParameterBindings, LoadQueryInfluencers loadQueryInfluencers, - SqlAstCreationContext creationContext); + SqlAstCreationContext creationContext, + boolean deduplicateSelectionItems); SqmTranslator createSimpleDeleteTranslator( SqmDeleteStatement sqmDeleteStatement, diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/StandardSqmTranslatorFactory.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/StandardSqmTranslatorFactory.java index 5b26626816..f00102e6b2 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/StandardSqmTranslatorFactory.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/StandardSqmTranslatorFactory.java @@ -35,14 +35,16 @@ public class StandardSqmTranslatorFactory implements SqmTranslatorFactory { DomainParameterXref domainParameterXref, QueryParameterBindings domainParameterBindings, LoadQueryInfluencers loadQueryInfluencers, - SqlAstCreationContext creationContext) { + SqlAstCreationContext creationContext, + boolean deduplicateSelectionItems) { return new StandardSqmTranslator<>( sqmSelectStatement, queryOptions, domainParameterXref, domainParameterBindings, loadQueryInfluencers, - creationContext + creationContext, + deduplicateSelectionItems ); } @@ -60,7 +62,8 @@ public class StandardSqmTranslatorFactory implements SqmTranslatorFactory { domainParameterXref, domainParameterBindings, loadQueryInfluencers, - creationContext + creationContext, + false ); } @@ -78,7 +81,8 @@ public class StandardSqmTranslatorFactory implements SqmTranslatorFactory { domainParameterXref, domainParameterBindings, loadQueryInfluencers, - creationContext + creationContext, + false ); } @@ -96,7 +100,8 @@ public class StandardSqmTranslatorFactory implements SqmTranslatorFactory { domainParameterXref, domainParameterBindings, loadQueryInfluencers, - creationContext + creationContext, + false ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/SqlAstQueryPartProcessingStateImpl.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/SqlAstQueryPartProcessingStateImpl.java index 3985c3b521..9d08701a17 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/SqlAstQueryPartProcessingStateImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/SqlAstQueryPartProcessingStateImpl.java @@ -20,6 +20,7 @@ import org.hibernate.sql.ast.spi.SqlSelection; import org.hibernate.sql.ast.tree.expression.Expression; import org.hibernate.sql.ast.tree.select.QueryPart; import org.hibernate.sql.ast.tree.select.QuerySpec; +import org.hibernate.sql.ast.tree.select.SelectClause; import org.hibernate.type.descriptor.java.JavaType; import org.hibernate.type.spi.TypeConfiguration; @@ -31,14 +32,17 @@ public class SqlAstQueryPartProcessingStateImpl implements SqlAstQueryPartProcessingState { private final QueryPart queryPart; + private final boolean deduplicateSelectionItems; public SqlAstQueryPartProcessingStateImpl( QueryPart queryPart, SqlAstProcessingState parent, SqlAstCreationState creationState, - Supplier currentClauseAccess) { + Supplier currentClauseAccess, + boolean deduplicateSelectionItems) { super( parent, creationState, currentClauseAccess ); this.queryPart = queryPart; + this.deduplicateSelectionItems = deduplicateSelectionItems; } public SqlAstQueryPartProcessingStateImpl( @@ -46,9 +50,11 @@ public class SqlAstQueryPartProcessingStateImpl SqlAstProcessingState parent, SqlAstCreationState creationState, Function expressionResolverDecorator, - Supplier currentClauseAccess) { + Supplier currentClauseAccess, + boolean deduplicateSelectionItems) { super( parent, creationState, expressionResolverDecorator, currentClauseAccess ); this.queryPart = queryPart; + this.deduplicateSelectionItems = deduplicateSelectionItems; } @Override @@ -79,11 +85,12 @@ public class SqlAstQueryPartProcessingStateImpl existing = sqlSelectionMap.get( expression ); } - if ( existing != null ) { + if ( existing != null && deduplicateSelectionItems ) { return existing; } - final int valuesArrayPosition = sqlSelectionMap.size(); + final SelectClause selectClause = ( (QuerySpec) queryPart ).getSelectClause(); + final int valuesArrayPosition = selectClause.getSqlSelections().size(); final SqlSelection sqlSelection = expression.createSqlSelection( valuesArrayPosition + 1, valuesArrayPosition, @@ -93,7 +100,7 @@ public class SqlAstQueryPartProcessingStateImpl sqlSelectionMap.put( expression, sqlSelection ); - ( (QuerySpec) queryPart ).getSelectClause().addSqlSelection( sqlSelection ); + selectClause.addSqlSelection( sqlSelection ); return sqlSelection; } diff --git a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/StandardSqmTranslator.java b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/StandardSqmTranslator.java index 45ace5b5aa..65347cbe21 100644 --- a/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/StandardSqmTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/query/sqm/sql/internal/StandardSqmTranslator.java @@ -11,7 +11,6 @@ import org.hibernate.query.spi.QueryOptions; import org.hibernate.query.spi.QueryParameterBindings; import org.hibernate.query.sqm.internal.DomainParameterXref; import org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter; -import org.hibernate.query.sqm.sql.SqmTranslation; import org.hibernate.query.sqm.tree.SqmStatement; import org.hibernate.sql.ast.spi.SqlAstCreationContext; import org.hibernate.sql.ast.tree.Statement; @@ -29,7 +28,16 @@ public class StandardSqmTranslator extends BaseSqmToSqlAstC DomainParameterXref domainParameterXref, QueryParameterBindings domainParameterBindings, LoadQueryInfluencers fetchInfluencers, - SqlAstCreationContext creationContext) { - super( creationContext, statement, queryOptions, fetchInfluencers, domainParameterXref, domainParameterBindings ); + SqlAstCreationContext creationContext, + boolean deduplicateSelectionItems) { + super( + creationContext, + statement, + queryOptions, + fetchInfluencers, + domainParameterXref, + domainParameterBindings, + deduplicateSelectionItems + ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java index 034b164af3..2b549c88c7 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/spi/AbstractSqlAstTranslator.java @@ -1012,7 +1012,7 @@ public abstract class AbstractSqlAstTranslator implemen protected void visitForUpdateClause(QuerySpec querySpec) { if ( querySpec.isRoot() ) { if ( forUpdate != null ) { - final Boolean followOnLocking = getLockOptions().getFollowOnLocking(); + final Boolean followOnLocking = getLockOptions() == null ? Boolean.FALSE : getLockOptions().getFollowOnLocking(); if ( Boolean.TRUE.equals( followOnLocking ) ) { lockOptions = null; } @@ -1041,7 +1041,7 @@ public abstract class AbstractSqlAstTranslator implemen // Since we get here, we know that no alias locks were applied. // We only apply locking on the root query though if there is a global lock mode final LockOptions lockOptions = getLockOptions(); - final Boolean followOnLocking = lockOptions.getFollowOnLocking(); + final Boolean followOnLocking = getLockOptions() == null ? Boolean.FALSE : lockOptions.getFollowOnLocking(); if ( Boolean.TRUE.equals( followOnLocking ) ) { this.lockOptions = null; } @@ -1184,6 +1184,9 @@ public abstract class AbstractSqlAstTranslator implemen } protected LockMode getEffectiveLockMode(String alias) { + if ( getLockOptions() == null ) { + return LockMode.NONE; + } final QueryPart currentQueryPart = getQueryPartStack().getCurrent(); LockMode lockMode = getLockOptions().getAliasSpecificLockMode( alias ); if ( currentQueryPart.isRoot() && lockMode == null ) { @@ -1193,6 +1196,9 @@ public abstract class AbstractSqlAstTranslator implemen } protected int getEffectiveLockTimeout(LockMode lockMode) { + if ( getLockOptions() == null ) { + return LockOptions.WAIT_FOREVER; + } int timeoutMillis = getLockOptions().getTimeOut(); switch ( lockMode ) { //noinspection deprecation diff --git a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/CaseSearchedExpression.java b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/CaseSearchedExpression.java index 9f5e696409..b38a4973d6 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/CaseSearchedExpression.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/ast/tree/expression/CaseSearchedExpression.java @@ -86,15 +86,6 @@ public class CaseSearchedExpression implements Expression, DomainResultProducer public void applySqlSelections(DomainResultCreationState creationState) { final SqlExpressionResolver sqlExpressionResolver = creationState.getSqlAstCreationState() .getSqlExpressionResolver(); - final SqlSelection sqlSelection = sqlExpressionResolver - .resolveSqlSelection( - this, - type.getExpressibleJavaType(), - creationState.getSqlAstCreationState() - .getCreationContext() - .getSessionFactory() - .getTypeConfiguration() - ); sqlExpressionResolver.resolveSqlSelection( this, type.getExpressibleJavaType(), diff --git a/hibernate-core/src/main/java/org/hibernate/sql/exec/spi/AbstractJdbcOperation.java b/hibernate-core/src/main/java/org/hibernate/sql/exec/spi/AbstractJdbcOperation.java index 6811aed571..c007415556 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/exec/spi/AbstractJdbcOperation.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/exec/spi/AbstractJdbcOperation.java @@ -78,6 +78,10 @@ public class AbstractJdbcOperation implements JdbcOperation { public boolean dependsOnParameterBindings() { return !appliedParameters.isEmpty(); } + + public Map getAppliedParameters() { + return appliedParameters; + } @Override public boolean isCompatibleWith(JdbcParameterBindings jdbcParameterBindings, QueryOptions queryOptions) { diff --git a/hibernate-core/src/main/java/org/hibernate/sql/exec/spi/JdbcSelect.java b/hibernate-core/src/main/java/org/hibernate/sql/exec/spi/JdbcSelect.java index ca9d4c4513..34fd491b7d 100644 --- a/hibernate-core/src/main/java/org/hibernate/sql/exec/spi/JdbcSelect.java +++ b/hibernate-core/src/main/java/org/hibernate/sql/exec/spi/JdbcSelect.java @@ -87,6 +87,14 @@ public class JdbcSelect extends AbstractJdbcOperation { public boolean usesLimitParameters() { return offsetParameter != null || limitParameter != null; } + + public JdbcParameter getOffsetParameter() { + return offsetParameter; + } + + public JdbcParameter getLimitParameter() { + return limitParameter; + } public JdbcLockStrategy getLockStrategy() { return jdbcLockStrategy; diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/CriteriaEntityGraphTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/CriteriaEntityGraphTest.java index 0249bb04cd..e365526fcc 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/CriteriaEntityGraphTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/CriteriaEntityGraphTest.java @@ -384,7 +384,8 @@ public class CriteriaEntityGraphTest implements SessionFactoryScopeAware { ( (QuerySqmImpl) hqlQuery ).getDomainParameterXref(), query.getParameterBindings(), loadQueryInfluencers, - session.getSessionFactory() + session.getSessionFactory(), + true ); final SqmTranslation sqmInterpretation = sqmConverter.translate(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/HqlEntityGraphTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/HqlEntityGraphTest.java index 30d71ab169..d5cf8044c5 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/HqlEntityGraphTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/entitygraph/ast/HqlEntityGraphTest.java @@ -381,7 +381,8 @@ public class HqlEntityGraphTest implements SessionFactoryScopeAware { ( (QuerySqmImpl) hqlQuery ).getDomainParameterXref(), query.getParameterBindings(), loadQueryInfluencers, - session.getSessionFactory() + session.getSessionFactory(), + true ); final SqmTranslation sqmInterpretation = sqmConverter.translate(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/EntityJoinTest.java b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/EntityJoinTest.java index f983eaac97..a95e49cc28 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/EntityJoinTest.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/query/hql/EntityJoinTest.java @@ -192,8 +192,9 @@ public class EntityJoinTest { DomainParameterXref.empty(), QueryParameterBindings.NO_PARAM_BINDINGS, LoadQueryInfluencers.NONE, - factory - ); + factory, + true + ); final SqmTranslation sqmTranslation = selectTranslator.translate(); final SelectStatement sqlAst = sqmTranslation.getSqlAst(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/sql/ast/SmokeTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/sql/ast/SmokeTests.java index 6ed6868307..b137db3a25 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/sql/ast/SmokeTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/sql/ast/SmokeTests.java @@ -84,7 +84,8 @@ public class SmokeTests { ( (QuerySqmImpl) hqlQuery ).getDomainParameterXref(), query.getParameterBindings(), session.getLoadQueryInfluencers(), - scope.getSessionFactory() + scope.getSessionFactory(), + true ); final SqmTranslation sqmInterpretation = sqmConverter.translate(); @@ -143,7 +144,8 @@ public class SmokeTests { ( (QuerySqmImpl) hqlQuery ).getDomainParameterXref(), query.getParameterBindings(), session.getLoadQueryInfluencers(), - scope.getSessionFactory() + scope.getSessionFactory(), + true ); final SqmTranslation sqmInterpretation = sqmConverter.translate(); diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/sql/results/AbstractResultTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/sql/results/AbstractResultTests.java index 3244696b13..29dce8b572 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/sql/results/AbstractResultTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/sql/results/AbstractResultTests.java @@ -37,7 +37,8 @@ public class AbstractResultTests { DomainParameterXref.from( sqm ), parameterBindings, LoadQueryInfluencers.NONE, - sessionFactory + sessionFactory, + true ); return sqmConverter.translate().getSqlAst();