package org.dayatang.domain.internal.criterion;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.dayatang.domain.NamedParameters;
import org.dayatang.utils.Assert;
/**
* 判断某个属性的值是否位于指定的值空间范围的查询条件
* @author yyang
*/
public class BetweenCriterion extends BasicCriterion {
private final Comparable<?> from;
private final Comparable<?> to;
/**
* 创建查询条件实例
* @param propName 属性名称
* @param from 值的下限
* @param to 值的上限
*/
public BetweenCriterion(String propName, Comparable<?> from, Comparable<?> to) {
super(propName);
Assert.notNull(from, "From value is null!");
Assert.notNull(to, "To value is null!");
this.from = from;
this.to = to;
}
/**
* 获取属性值上限
* @return 属性值上限
*/
public Comparable<?> getFrom() {
return from;
}
/**
* 获取属性值下限
* @return 属性值下限
*/
public Comparable<?> getTo() {
return to;
}
@Override
public String toQueryString() {
return String.format("%s between %s and %s",
getPropNameWithAlias(),
getParamNameWithColon() + "_from",
getParamNameWithColon() + "_to");
}
@Override
public NamedParameters getParameters() {
return NamedParameters.create()
.add(getParamName() + "_from", from)
.add(getParamName() + "_to", to);
}
/**
* 判断等价性
* @param other 要用来判等的另一个对象
* @return 如果当前对象和other等价,则返回true,否则返回false
*/
@Override
public boolean equals(final Object other) {
if (this == other) {
return true;
}
if (!(other instanceof BetweenCriterion)) {
return false;
}
BetweenCriterion that = (BetweenCriterion) other;
return new EqualsBuilder()
.append(this.getPropName(), that.getPropName())
.append(this.getFrom(), that.getFrom())
.append(this.getTo(), that.getTo())
.isEquals();
}
/**
* 计算哈希值
* @return 当前对象实例的哈希值
*/
@Override
public int hashCode() {
return new HashCodeBuilder(17, 37).append(getPropName())
.append(from).append(to).toHashCode();
}
@Override
public String toString() {
return getPropName() + " between " + from + " and " + to;
}
}