org.hibernate.query.sqm.tree.expression.JpaCriteriaParameter 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.expression;
import org.hibernate.metamodel.model.domain.AllowableParameterType;
import org.hibernate.procedure.spi.NamedCallableQueryMemento;
import org.hibernate.query.ParameterMetadata;
import org.hibernate.query.criteria.JpaParameterExpression;
import org.hibernate.query.spi.QueryParameterImplementor;
import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.query.sqm.SqmExpressable;
import org.hibernate.query.sqm.sql.internal.DomainResultProducer;
/**
* {@link JpaParameterExpression} created via JPA {@link jakarta.persistence.criteria.CriteriaBuilder}.
*
* Each occurence of a JpaParameterExpression results in a unique SqmParameter
*
* @see ParameterMetadata
* @see NodeBuilder#parameter
*
* @author Steve Ebersole
*/
public class JpaCriteriaParameter
extends AbstractSqmExpression
implements SqmParameter, QueryParameterImplementor, DomainResultProducer {
private final String name;
private final T value;
private boolean allowsMultiValuedBinding;
public JpaCriteriaParameter(
AllowableParameterType type,
boolean allowsMultiValuedBinding,
NodeBuilder nodeBuilder) {
this( null, type, allowsMultiValuedBinding, nodeBuilder );
}
public JpaCriteriaParameter(
String name,
AllowableParameterType type,
boolean allowsMultiValuedBinding,
NodeBuilder nodeBuilder) {
super( type, nodeBuilder );
this.name = name;
this.value = null;
this.allowsMultiValuedBinding = allowsMultiValuedBinding;
}
public JpaCriteriaParameter(
String name,
AllowableParameterType type,
T value,
boolean allowsMultiValuedBinding,
NodeBuilder nodeBuilder) {
super( type, nodeBuilder );
this.name = name;
this.value = value;
this.allowsMultiValuedBinding = allowsMultiValuedBinding;
}
public JpaCriteriaParameter(AllowableParameterType type, T value, NodeBuilder criteriaBuilder) {
super( type, criteriaBuilder );
this.name = null;
this.value = value;
}
@Override
public String getName() {
return name;
}
public T getValue() {
return value;
}
@Override
public Integer getPosition() {
// for criteria anyway, these cannot be positional
return null;
}
@Override
public boolean allowsMultiValuedBinding() {
return allowsMultiValuedBinding;
}
@Override
public void disallowMultiValuedBinding() {
allowsMultiValuedBinding = false;
}
@Override
public boolean allowMultiValuedBinding() {
return allowsMultiValuedBinding();
}
@Override
public AllowableParameterType getAnticipatedType() {
return getHibernateType();
}
@Override
public void applyAnticipatedType(AllowableParameterType type) {
super.internalApplyInferableType( type );
}
@Override
public AllowableParameterType getNodeType() {
return (AllowableParameterType) super.getNodeType();
}
@Override
public SqmParameter copy() {
return new JpaCriteriaParameter<>(
getName(),
getAnticipatedType(),
allowMultiValuedBinding(),
nodeBuilder()
);
}
@Override
public AllowableParameterType getHibernateType() {
return this.getNodeType();
}
@Override
public Class getParameterType() {
return this.getNodeType().getExpressableJavaTypeDescriptor().getJavaTypeClass();
}
@Override
protected void internalApplyInferableType(SqmExpressable newType) {
super.internalApplyInferableType( newType );
}
@Override
public X accept(SemanticQueryWalker walker) {
return walker.visitJpaCriteriaParameter( this );
}
@Override
public NamedCallableQueryMemento.ParameterMemento toMemento() {
throw new UnsupportedOperationException( "ParameterMemento cannot be extracted from Criteria query parameter" );
}
@Override
public void appendHqlString(StringBuilder sb) {
if ( getName() == null ) {
sb.append( value );
}
else {
sb.append( ':' );
sb.append( getName() );
}
}
}