All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hibernate.query.sqm.tree.expression.JpaCriteriaParameter Maven / Gradle / Ivy

There is a newer version: 7.0.0.Alpha2
Show newest version
/*
 * 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() );
		}
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy