Skip to content

Commit b516a81

Browse files
committed
HHH-19781 Copy original criteria to avoid duplicated specifications
Also avoid double-copy for HQL-based specifications
1 parent 2cfd7f2 commit b516a81

File tree

2 files changed

+7
-4
lines changed

2 files changed

+7
-4
lines changed

hibernate-core/src/main/java/org/hibernate/query/specification/internal/MutationSpecificationImpl.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import java.util.function.BiConsumer;
4242

4343
import static org.hibernate.query.sqm.tree.SqmCopyContext.noParamCopyContext;
44+
import static org.hibernate.query.sqm.tree.SqmCopyContext.simpleContext;
4445

4546
/**
4647
* Standard implementation of MutationSpecification
@@ -124,7 +125,7 @@ public MutationQuery createQuery(StatelessSession session) {
124125
public MutationQuery createQuery(SharedSessionContract session) {
125126
final var sessionImpl = session.unwrap(SharedSessionContractImplementor.class);
126127
final SqmDeleteOrUpdateStatement<T> sqmStatement = build( sessionImpl.getFactory().getQueryEngine() );
127-
return new SqmQueryImpl<>( sqmStatement, true, null, sessionImpl );
128+
return new SqmQueryImpl<>( sqmStatement, false, null, sessionImpl );
128129
}
129130

130131
private SqmDeleteOrUpdateStatement<T> build(QueryEngine queryEngine) {
@@ -135,7 +136,8 @@ private SqmDeleteOrUpdateStatement<T> build(QueryEngine queryEngine) {
135136
mutationTargetRoot = resolveSqmRoot( sqmStatement, mutationTarget );
136137
}
137138
else if ( deleteOrUpdateStatement != null ) {
138-
sqmStatement = deleteOrUpdateStatement;
139+
sqmStatement = (SqmDeleteOrUpdateStatement<T>) deleteOrUpdateStatement
140+
.copy( simpleContext() );
139141
mutationTargetRoot = resolveSqmRoot( sqmStatement,
140142
sqmStatement.getTarget().getManagedType().getJavaType() );
141143
}

hibernate-core/src/main/java/org/hibernate/query/specification/internal/SelectionSpecificationImpl.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
import static org.hibernate.internal.util.collections.CollectionHelper.isEmpty;
4747
import static org.hibernate.query.sqm.internal.SqmUtil.validateCriteriaQuery;
4848
import static org.hibernate.query.sqm.tree.SqmCopyContext.noParamCopyContext;
49+
import static org.hibernate.query.sqm.tree.SqmCopyContext.simpleContext;
4950

5051
/**
5152
* Standard implementation of SelectionSpecification
@@ -166,7 +167,7 @@ public SelectionQuery<T> createQuery(StatelessSession session) {
166167
public SelectionQuery<T> createQuery(SharedSessionContract session) {
167168
final var sessionImpl = session.unwrap(SharedSessionContractImplementor.class);
168169
final SqmSelectStatement<T> sqmStatement = build( sessionImpl.getFactory().getQueryEngine() );
169-
return new SqmSelectionQueryImpl<>( sqmStatement, true, resultType, sessionImpl );
170+
return new SqmSelectionQueryImpl<>( sqmStatement, false, resultType, sessionImpl );
170171
}
171172

172173
private SqmSelectStatement<T> build(QueryEngine queryEngine) {
@@ -177,7 +178,7 @@ private SqmSelectStatement<T> build(QueryEngine queryEngine) {
177178
sqmRoot = extractRoot( sqmStatement, resultType, hql );
178179
}
179180
else if ( criteriaQuery != null ) {
180-
sqmStatement = (SqmSelectStatement<T>) criteriaQuery;
181+
sqmStatement = ((SqmSelectStatement<T>) criteriaQuery).copy( simpleContext() );
181182
sqmRoot = extractRoot( sqmStatement, resultType, "criteria query" );
182183
}
183184
else {

0 commit comments

Comments
 (0)