org.hibernate.query.sqm.tree.predicate.SqmInListPredicate Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hibernate-core Show documentation
Show all versions of hibernate-core Show documentation
Hibernate's core ORM functionality
/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html
*/
package org.hibernate.query.sqm.tree.predicate;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.criteria.Expression;
import org.hibernate.internal.util.collections.ArrayHelper;
import org.hibernate.query.criteria.JpaExpression;
import org.hibernate.query.internal.QueryHelper;
import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.query.sqm.tree.expression.SqmExpression;
/**
* @author Steve Ebersole
*/
public class SqmInListPredicate extends AbstractNegatableSqmPredicate implements SqmInPredicate {
private final SqmExpression testExpression;
private final List> listExpressions;
public SqmInListPredicate(SqmExpression testExpression, NodeBuilder nodeBuilder) {
this( testExpression, new ArrayList<>(), nodeBuilder );
}
@SuppressWarnings({"unchecked", "unused"})
public SqmInListPredicate(
SqmExpression testExpression,
NodeBuilder nodeBuilder,
SqmExpression... listExpressions) {
this( testExpression, ArrayHelper.toExpandableList( listExpressions ), nodeBuilder );
}
public SqmInListPredicate(
SqmExpression testExpression,
List> listExpressions,
NodeBuilder nodeBuilder) {
this( testExpression, listExpressions, false, nodeBuilder );
}
@SuppressWarnings("WeakerAccess")
public SqmInListPredicate(
SqmExpression testExpression,
List> listExpressions,
boolean negated,
NodeBuilder nodeBuilder) {
super( negated, nodeBuilder );
this.testExpression = testExpression;
this.listExpressions = listExpressions;
for ( SqmExpression listExpression : listExpressions ) {
implyListElementType( listExpression );
}
}
@Override
public SqmExpression getTestExpression() {
return testExpression;
}
@Override
public SqmExpression getExpression() {
return getTestExpression();
}
@Override
public SqmInPredicate value(Object value) {
addExpression( nodeBuilder().literal( value ) );
return this;
}
@Override
public SqmInPredicate value(Expression value) {
addExpression( (SqmExpression) value );
return this;
}
@Override
public SqmInPredicate value(JpaExpression value) {
addExpression( (SqmExpression) value );
return this;
}
public List> getListExpressions() {
return listExpressions;
}
public void addExpression(SqmExpression expression) {
implyListElementType( expression );
//noinspection unchecked
listExpressions.add( expression );
}
private void implyListElementType(SqmExpression expression) {
//noinspection unchecked
expression.applyInferableType(
QueryHelper.highestPrecedenceType2(
getTestExpression().getNodeType(),
expression.getNodeType()
)
);
}
@Override
public X accept(SemanticQueryWalker walker) {
return walker.visitInListPredicate( this );
}
}