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;
import org.dayatang.utils.BeanUtils;
import java.util.Map;
/**
* 代表属性值与另一个属性值比较的一类查询条件
* Created by yyang on 14-2-23.
*/
public abstract class PropertyCompareCriterion extends BasicCriterion {
private final String otherPropName;
private String operator;
public PropertyCompareCriterion(String propName, String otherPropName) {
super(propName);
Assert.notBlank(otherPropName, "Other property name is null or blank!");
this.otherPropName = otherPropName;
}
/**
* 获得另一个属性名
* @return 另一个属性名
*/
public String getOtherPropName() {
return otherPropName;
}
protected final void setOperator(String operator) {
this.operator = operator;
}
@Override
public String toQueryString() {
return getPropNameWithAlias() + operator + ROOT_ALIAS + "." + otherPropName;
}
@Override
public NamedParameters getParameters() {
return NamedParameters.create();
}
@Override
public boolean equals(final Object other) {
if (this == other) {
return true;
}
if (other == null) {
return false;
}
if (!(getClass().isAssignableFrom(other.getClass()))) {
return false;
}
Map<String, Object> thisPropValues = new BeanUtils(this).getPropValues();
Map<String, Object> otherPropValues = new BeanUtils(other).getPropValues();
return new EqualsBuilder()
.append(thisPropValues.get("propName"), otherPropValues.get("propName"))
.append(thisPropValues.get("otherPropName"), otherPropValues.get("otherPropName"))
.isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder(17, 37)
.append(getPropName())
.append(getOtherPropName())
.toHashCode();
}
@Override
public String toString() {
return getPropName() + operator + getOtherPropName();
}
}