/*
 * 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.internal;

import javax.persistence.TemporalType;

import org.hibernate.query.spi.QueryParameterBinding;
import org.hibernate.query.spi.QueryParameterBindingTypeResolver;
import org.hibernate.query.spi.QueryParameterBindingValidator;
import org.hibernate.type.Type;

Author:Steve Ebersole
/** * @author Steve Ebersole */
public class QueryParameterBindingImpl<T> implements QueryParameterBinding<T> { private final QueryParameterBindingTypeResolver typeResolver; private final boolean isBindingValidationRequired; private boolean isBound; private Type bindType; private T bindValue; public QueryParameterBindingImpl( Type type, QueryParameterBindingTypeResolver typeResolver, boolean isBindingValidationRequired) { this.bindType = type; this.typeResolver = typeResolver; this.isBindingValidationRequired = isBindingValidationRequired; } @Override public boolean isBound() { return isBound; } @Override public T getBindValue() { return bindValue; } @Override public Type getBindType() { return bindType; } @Override public void setBindValue(T value) { if ( isBindingValidationRequired ) { validate( value ); } bindValue( value ); } @Override public void setBindValue(T value, Type clarifiedType) { if ( isBindingValidationRequired ) { validate( value, clarifiedType ); } bindValue( value ); if ( clarifiedType != null ) { this.bindType = clarifiedType; } } @Override public void setBindValue(T value, TemporalType clarifiedTemporalType) { if ( isBindingValidationRequired ) { validate( value, clarifiedTemporalType ); } bindValue( value ); this.bindType = BindingTypeHelper.INSTANCE.determineTypeForTemporalType( clarifiedTemporalType, bindType, value ); } private void bindValue(T value) { this.isBound = true; this.bindValue = value; if ( bindType == null ) { this.bindType = typeResolver.resolveParameterBindType( value ); } } private void validate(T value) { QueryParameterBindingValidator.INSTANCE.validate( getBindType(), value ); } private void validate(T value, Type clarifiedType) { QueryParameterBindingValidator.INSTANCE.validate( clarifiedType, value ); } private void validate(T value, TemporalType clarifiedTemporalType) { QueryParameterBindingValidator.INSTANCE.validate( getBindType(), value, clarifiedTemporalType ); } }