package org.hibernate.param;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Iterator;
import org.hibernate.engine.spi.QueryParameters;
import org.hibernate.engine.spi.SharedSessionContractImplementor;
import org.hibernate.type.Type;
public class DynamicFilterParameterSpecification implements ParameterSpecification {
private final String filterName;
private final String parameterName;
private final Type definedParameterType;
public DynamicFilterParameterSpecification(
String filterName,
String parameterName,
Type definedParameterType) {
this.filterName = filterName;
this.parameterName = parameterName;
this.definedParameterType = definedParameterType;
}
@Override
public int bind(
PreparedStatement statement,
QueryParameters qp,
SharedSessionContractImplementor session,
int start) throws SQLException {
final int columnSpan = definedParameterType.getColumnSpan( session.getFactory() );
final String fullParamName = filterName + '.' + parameterName;
final Object value = session.getLoadQueryInfluencers().getFilterParameterValue(fullParamName);
final Type type = session.getLoadQueryInfluencers().getFilterParameterType(fullParamName);
if ( Collection.class.isInstance( value ) ) {
int positions = 0;
Iterator itr = ( ( Collection ) value ).iterator();
while ( itr.hasNext() ) {
Object next = itr.next();
qp.bindDynamicParameter( type, next );
definedParameterType.nullSafeSet( statement, next, start + positions, session );
positions += columnSpan;
}
return positions;
}
else {
qp.bindDynamicParameter(type, value);
definedParameterType.nullSafeSet( statement, value, start, session );
return columnSpan;
}
}
@Override
public Type getExpectedType() {
return definedParameterType;
}
@Override
public void setExpectedType(Type expectedType) {
}
@Override
public String renderDisplayInfo() {
return "dynamic-filter={filterName=" + filterName + ",paramName=" + parameterName + "}";
}
}