Skip to content

optimize AbstractSqmStatement.getParameters() and eliminate copy/paste #10353

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 16, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.IdentityHashMap;
import java.util.Iterator;
import java.util.LinkedHashSet;
Expand All @@ -17,6 +18,7 @@
import java.util.Set;
import java.util.StringTokenizer;

import jakarta.persistence.criteria.ParameterExpression;
import org.hibernate.AssertionFailure;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
Expand Down Expand Up @@ -74,6 +76,7 @@
import org.hibernate.query.sqm.tree.expression.SqmJpaCriteriaParameterWrapper;
import org.hibernate.query.sqm.tree.expression.SqmParameter;
import org.hibernate.query.sqm.tree.expression.SqmTuple;
import org.hibernate.query.sqm.tree.expression.ValueBindJpaCriteriaParameter;
import org.hibernate.query.sqm.tree.from.SqmAttributeJoin;
import org.hibernate.query.sqm.tree.from.SqmFrom;
import org.hibernate.query.sqm.tree.from.SqmJoin;
Expand Down Expand Up @@ -112,6 +115,8 @@
import static java.util.Collections.emptyList;
import static java.util.Collections.emptyMap;
import static java.util.Collections.emptySet;
import static java.util.Collections.singleton;
import static java.util.Collections.unmodifiableSet;
import static java.util.stream.Collectors.toList;
import static org.hibernate.internal.util.NullnessUtil.castNonNull;
import static org.hibernate.internal.util.collections.CollectionHelper.arrayList;
Expand Down Expand Up @@ -1326,4 +1331,27 @@ private static void throwQueryTypeMismatchException(
resultClass.getName()
) );
}

public static Set<ParameterExpression<?>> getParameters(SqmStatement<?> statement) {
final Set<SqmParameter<?>> parameters = statement.getSqmParameters();
return switch ( parameters.size() ) {
case 0 -> emptySet();
case 1 -> {
final SqmParameter<?> parameter = parameters.iterator().next();
yield parameter instanceof ValueBindJpaCriteriaParameter
? emptySet()
: singleton( parameter );
}
default -> {
final Set<ParameterExpression<?>> parameterExpressions =
new HashSet<>( parameters.size() );
for ( SqmParameter<?> parameter : parameters ) {
if ( !(parameter instanceof ValueBindJpaCriteriaParameter) ) {
parameterExpressions.add( parameter );
}
}
yield unmodifiableSet( parameterExpressions );
}
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,19 @@
*/
package org.hibernate.query.sqm.tree;

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;

import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.query.sqm.SqmQuerySource;
import org.hibernate.query.sqm.internal.ParameterCollector;
import org.hibernate.query.sqm.internal.SqmUtil;
import org.hibernate.query.sqm.tree.expression.SqmParameter;
import org.hibernate.query.sqm.tree.expression.ValueBindJpaCriteriaParameter;

import jakarta.persistence.criteria.ParameterExpression;

import static java.util.Collections.emptySet;
import static java.util.Collections.unmodifiableSet;
import static org.hibernate.query.sqm.tree.jpa.ParameterCollector.collectParameters;

/**
Expand Down Expand Up @@ -66,7 +65,6 @@ public void addParameter(SqmParameter<?> parameter) {
if ( parameters == null ) {
parameters = new HashSet<>();
}

parameters.add( parameter );
}

Expand All @@ -76,8 +74,9 @@ public Set<SqmParameter<?>> getSqmParameters() {
assert parameters == null : "SqmSelectStatement (as Criteria) should not have collected parameters";
return collectParameters( this );
}

return parameters == null ? Collections.emptySet() : Collections.unmodifiableSet( parameters );
else {
return parameters == null ? emptySet() : unmodifiableSet( parameters );
}
}

@Override
Expand All @@ -88,13 +87,9 @@ public ParameterResolutions resolveParameters() {
@Override
public Set<ParameterExpression<?>> getParameters() {
// At this level, the number of parameters may still be growing as
// nodes are added to the Criteria - so we re-calculate this every
// time.
//
// for a "finalized" set of parameters, use `#resolveParameters` instead
assert getQuerySource() == SqmQuerySource.CRITERIA;
return getSqmParameters().stream()
.filter( parameterExpression -> !( parameterExpression instanceof ValueBindJpaCriteriaParameter ) )
.collect( Collectors.toSet() );
// nodes are added to the Criteria, so we recalculate this every time.
// For a finalized set of parameters, use resolveParameters() instead
assert querySource == SqmQuerySource.CRITERIA;
return SqmUtil.getParameters( this );
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import org.hibernate.Incubating;
import org.hibernate.query.criteria.JpaConflictClause;
Expand All @@ -21,7 +20,6 @@
import org.hibernate.query.sqm.tree.cte.SqmCteStatement;
import org.hibernate.query.sqm.tree.domain.SqmPath;
import org.hibernate.query.sqm.tree.expression.SqmParameter;
import org.hibernate.query.sqm.tree.expression.ValueBindJpaCriteriaParameter;
import org.hibernate.query.sqm.tree.from.SqmRoot;
import org.hibernate.query.sqm.tree.select.SqmQueryPart;
import org.hibernate.query.sqm.tree.select.SqmQuerySpec;
Expand All @@ -33,7 +31,6 @@
import jakarta.persistence.criteria.Path;
import org.checkerframework.checker.nullness.qual.Nullable;

import jakarta.persistence.criteria.ParameterExpression;
import jakarta.persistence.criteria.Subquery;
import jakarta.persistence.metamodel.EntityType;

Expand Down Expand Up @@ -147,19 +144,6 @@ public JpaPredicate getRestriction() {
return null;
}

@Override
public Set<ParameterExpression<?>> getParameters() {
// At this level, the number of parameters may still be growing as
// nodes are added to the Criteria - so we re-calculate this every
// time.
//
// for a "finalized" set of parameters, use `#resolveParameters` instead
assert getQuerySource() == SqmQuerySource.CRITERIA;
return getSqmParameters().stream()
.filter( parameterExpression -> !( parameterExpression instanceof ValueBindJpaCriteriaParameter ) )
.collect( Collectors.toSet() );
}

@Override
public SqmInsertSelectStatement<T> setInsertionTargetPaths(Path<?>... insertionTargetPaths) {
super.setInsertionTargetPaths( insertionTargetPaths );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import org.hibernate.query.criteria.JpaConflictClause;
import org.hibernate.query.criteria.JpaCriteriaInsertValues;
Expand All @@ -25,10 +24,8 @@
import org.hibernate.query.sqm.tree.domain.SqmPath;
import org.hibernate.query.sqm.tree.expression.SqmExpression;
import org.hibernate.query.sqm.tree.expression.SqmParameter;
import org.hibernate.query.sqm.tree.expression.ValueBindJpaCriteriaParameter;
import org.hibernate.query.sqm.tree.from.SqmRoot;

import jakarta.persistence.criteria.ParameterExpression;
import jakarta.persistence.criteria.Subquery;
import jakarta.persistence.metamodel.EntityType;

Expand Down Expand Up @@ -154,19 +151,6 @@ public JpaPredicate getRestriction() {
return null;
}

@Override
public Set<ParameterExpression<?>> getParameters() {
// At this level, the number of parameters may still be growing as
// nodes are added to the Criteria - so we re-calculate this every
// time.
//
// for a "finalized" set of parameters, use `#resolveParameters` instead
assert getQuerySource() == SqmQuerySource.CRITERIA;
return getSqmParameters().stream()
.filter( parameterExpression -> !( parameterExpression instanceof ValueBindJpaCriteriaParameter ) )
.collect( Collectors.toSet() );
}

@Override
public SqmInsertValuesStatement<T> setInsertionTargetPaths(Path<?>... insertionTargetPaths) {
super.setInsertionTargetPaths( insertionTargetPaths );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -254,8 +254,7 @@ public <E> JpaRoot<? extends E> getRoot(int position, Class<E> type) {
* @see org.hibernate.query.criteria.JpaCriteriaQuery#getRoot(String, Class)
*/
public <E> JpaRoot<? extends E> getRoot(String alias, Class<E> type) {
final List<SqmRoot<?>> rootList = getQuerySpec().getRootList();
for ( SqmRoot<?> root : rootList ) {
for ( SqmRoot<?> root : getQuerySpec().getRootList() ) {
final String rootAlias = root.getAlias();
if ( rootAlias != null && rootAlias.equals( alias ) ) {
return castRoot( root, type );
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -295,9 +295,8 @@ public SqmQuerySpec<T> setSelection(JpaSelection<T> selection) {
// NOTE : this call comes from JPA which inherently supports just a
// single (possibly "compound") selection.
// We have this special case where we return the SqmSelectClause itself if it doesn't have exactly 1 item
if ( selection instanceof SqmSelectClause ) {
if ( selection instanceof SqmSelectClause sqmSelectClause ) {
if ( selection != selectClause ) {
final SqmSelectClause sqmSelectClause = (SqmSelectClause) selection;
final List<SqmSelection<?>> selections = sqmSelectClause.getSelections();
selectClause.setSelection( selections.get( 0 ).getSelectableNode() );
for ( int i = 1; i < selections.size(); i++ ) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

import org.hibernate.Internal;
import org.hibernate.query.criteria.JpaCriteriaQuery;
Expand All @@ -25,7 +24,6 @@
import org.hibernate.query.sqm.tree.SqmCopyContext;
import org.hibernate.query.sqm.tree.SqmStatement;
import org.hibernate.query.sqm.tree.cte.SqmCteStatement;
import org.hibernate.query.sqm.tree.expression.ValueBindJpaCriteriaParameter;
import org.hibernate.query.sqm.tree.expression.SqmParameter;
import org.hibernate.query.sqm.tree.from.SqmFromClause;
import org.hibernate.query.sqm.tree.predicate.SqmPredicate;
Expand Down Expand Up @@ -304,14 +302,10 @@ public SqmSelectStatement<T> distinct(boolean distinct) {
@Override
public Set<ParameterExpression<?>> getParameters() {
// At this level, the number of parameters may still be growing as
// nodes are added to the Criteria - so we re-calculate this every
// time.
//
// for a "finalized" set of parameters, use `#resolveParameters` instead
assert querySource == CRITERIA;
return getSqmParameters().stream()
.filter( parameterExpression -> !( parameterExpression instanceof ValueBindJpaCriteriaParameter ) )
.collect( Collectors.toSet() );
// nodes are added to the Criteria, so we recalculate this every time.
// For a finalized set of parameters, use resolveParameters() instead
assert querySource == SqmQuerySource.CRITERIA;
return SqmUtil.getParameters( this );
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
Expand Down Expand Up @@ -76,6 +75,7 @@
import jakarta.persistence.criteria.Subquery;
import jakarta.persistence.metamodel.EntityType;

import static java.util.Collections.emptySet;
import static org.hibernate.query.sqm.spi.SqmCreationHelper.combinePredicates;

/**
Expand Down Expand Up @@ -736,7 +736,7 @@ public Subquery<T> having(List<Predicate> restrictions) {

@Override
public Set<ParameterExpression<?>> getParameters() {
return Collections.emptySet();
return emptySet();
}

@Override
Expand Down
Loading