package org.nutz.dao.impl.sql.pojo; import org.nutz.dao.Chain; import org.nutz.dao.entity.Entity; import org.nutz.dao.entity.MappingField; import org.nutz.dao.jdbc.Jdbcs; import org.nutz.dao.jdbc.ValueAdaptor; import org.nutz.lang.Lang; public class UpdateFieldsByChainPItem extends AbstractPItem { private static final long serialVersionUID = 1L; private Chain chain; public UpdateFieldsByChainPItem(Chain chain) { this.chain = chain; } public void joinSql(Entity<?> en, StringBuilder sb) { if (chain.size() > 0) { sb.append(" SET "); Chain c = chain.head(); while (c != null) { sb.append(this._fmtcolnm(en, c.name())).append('='); if (c.special()) { Chain head = c; if (head.value() != null && head.value() instanceof String) { String str = (String) head.value(); if (str.length() > 0) { switch (str.charAt(0)) { case '+': case '-': case '*': case '/': case '%': case '&': case '^': case '|': sb.append(this._fmtcolnm(en, c.name())); break; } } } sb.append(head.value()); } else { sb.append("?"); } sb.append(','); c = c.next(); } sb.deleteCharAt(sb.length() - 1); sb.append(' '); } else { throw Lang.makeThrow("Entity chain for UPDATE '%s'", en.getType().getName()); } } public int joinAdaptor(Entity<?> en, ValueAdaptor[] adaptors, int off) { Chain c = chain.head(); while (c != null) { if (!c.special()) { MappingField mf = en.getField(c.name()); // TODO 移除这种数组下标用++的写法!!! if (c.adaptor() == null) adaptors[off++] = (null == mf ? Jdbcs.getAdaptorBy(c.value()) : mf.getAdaptor()); else adaptors[off++] = c.adaptor(); } c = c.next(); } return off; } public int joinParams(Entity<?> en, Object obj, Object[] params, int off) { Chain c = chain.head(); while (c != null) { if (!c.special()) params[off++] = c.value(); c = c.next(); } return off; } public int paramCount(Entity<?> en) { int count = 0; Chain c = chain.head(); while (c != null) { if (!c.special()) count++; c = c.next(); } return count; } }