package org.nutz.dao.impl.sql.pojo;
import org.nutz.castor.Castors;
import org.nutz.dao.entity.Entity;
import org.nutz.dao.entity.MappingField;
import org.nutz.dao.jdbc.ValueAdaptor;
import org.nutz.lang.Lang;
public class SingleColumnCondtionPItem extends AbstractPItem {
private ValueAdaptor va;
private Object def;
private String colName;
private Class<?> colType;
private MappingField mf;
private boolean casesensitive;
public SingleColumnCondtionPItem(MappingField mf, Object def) {
this.mf = mf;
this.va = mf.getAdaptor();
this.colName = mf.getColumnName();
this.colType = mf.getTypeClass();
this.def = def;
}
public SingleColumnCondtionPItem(String colName, Class<?> colType, ValueAdaptor va, Object def) {
this.colName = colName;
this.colType = colType;
this.va = va;
this.def = def;
}
public int joinParams(Entity<?> en, Object obj, Object[] params, int off) {
// 默认值可以直接使用
if (def == obj && null != obj) {
params[off++] = def;
}
// 进行更精细的判断...
else {
en = _en(en);
// 是个实体对象,试图直接取值
if (null != obj && null != mf && mf.getEntity() == en && en.getType().isInstance(obj))
params[off++] = mf.getValue(obj);
// 采用默认值
else if (null != def)
params[off++] = def;
// 试图转换传入的对象
else if (null != obj) {
// TODO 这是啥规则?!!! 完全搞不懂!!!
params[off++] = Castors.me().castTo(obj, colType);
}
// 逼急了,老子抛异常了!
else
throw Lang.impossible();
}
return off;
}
public void joinSql(Entity<?> en, StringBuilder sb) {
if (null != mf && !casesensitive)
switch (mf.getColumnType()) {
case CHAR:
case VARCHAR:
case TEXT:
sb.append(" WHERE LOWER(").append(colName).append(")=LOWER(?)");
return;
default :
break;
}
sb.append(" WHERE ").append(colName).append("=?");
}
public int joinAdaptor(Entity<?> en, ValueAdaptor[] adaptors, int off) {
adaptors[off++] = va;
return off;
}
public int paramCount(Entity<?> en) {
return 1;
}
public SingleColumnCondtionPItem setCasesensitive(boolean casesensitive) {
this.casesensitive = casesensitive;
return this;
}
}