package jef.database.wrapper.variable; import java.sql.SQLException; import java.util.Map; import javax.persistence.PersistenceException; import jef.database.Field; import jef.database.dialect.type.ColumnMapping; import jef.database.meta.ITableMetadata; import jef.database.query.ConditionQuery; import jef.database.query.Query; import jef.tools.reflect.BeanWrapper; public class UpdateVairable extends Variable { private Field field; public UpdateVairable(Field field) { this.field = field; } @Override String name() { return null; } @Override Object jdbcSet(BindVariableContext context, int index, ConditionQuery cq){ Query<?> query = (Query<?>) cq; try { ITableMetadata meta = query.getMeta(); ColumnMapping cType = meta.getColumnDef(field); Map<Field, Object> updateMap = query.getInstance().getUpdateValueMap(); if (updateMap.containsKey(field)) { Object value = updateMap.get(field); return context.setValueInPsmt(index, value, cType); } else { Object bean = query.getInstance(); Object value; if (cType != null) { value = cType.getFieldAccessor().get(query.getInstance()); } else { // 虽然每次创建一个BeanWrapper很浪费,不过这个分支应该是非常少走到的,大部分场合会走上面分支。 BeanWrapper bw = BeanWrapper.wrap(bean, BeanWrapper.FAST); value = bw.getPropertyValue(field.name()); } return context.setValueInPsmt(index, value, cType); } } catch (SQLException ex) { throw new PersistenceException("The query param type error, field=" + field.name() + " into bean " + query.getType(), ex); } catch (ClassCastException e) { throw new PersistenceException("The query param type error, field=" + field.name() + " into bean " + query.getType(), e); } } @Override public Object getConstantValue() { throw new UnsupportedOperationException(); } }