diff --git a/src/org/redkale/source/EntityInfo.java b/src/org/redkale/source/EntityInfo.java index b69a97c36..87c21f98d 100644 --- a/src/org/redkale/source/EntityInfo.java +++ b/src/org/redkale/source/EntityInfo.java @@ -989,7 +989,7 @@ public final class EntityInfo { /** * 拼接UPDATE给字段赋值的SQL片段 * - * @param sqlColumn 表字段名 + * @param sqlColumn 表字段名 * @param attr Attribute * @param cv ColumnValue * @param formatter 转义器 @@ -999,8 +999,7 @@ public final class EntityInfo { protected CharSequence formatSQLValue(String sqlColumn, Attribute attr, final ColumnValue cv, BiFunction formatter) { if (cv == null) return null; Object val = cv.getValue(); - CryptHandler handler = attr.attach(); - if (handler != null) val = handler.encrypt(val); + if (val instanceof ColumnNode && cv.getExpress() == ColumnExpress.MOV) return formatSQLValue(attr, (ColumnNode) val, formatter); switch (cv.getExpress()) { case INC: return new StringBuilder().append(sqlColumn).append(" + ").append(val); @@ -1015,11 +1014,45 @@ public final class EntityInfo { case ORR: return new StringBuilder().append(sqlColumn).append(" | ").append(val); case MOV: + CryptHandler handler = attr.attach(); + if (handler != null) val = handler.encrypt(val); return formatter == null ? formatToString(val) : formatter.apply(this, val); } + CryptHandler handler = attr.attach(); + if (handler != null) val = handler.encrypt(val); return formatter == null ? formatToString(val) : formatter.apply(this, val); } + protected CharSequence formatSQLValue(Attribute attr, final ColumnNode node, BiFunction formatter) { + Serializable left = node.getLeft(); + if (left instanceof CharSequence) { + left = this.getSQLColumn(null, left.toString()); + } else if (left instanceof ColumnNode) { + left = "(" + formatSQLValue(attr, (ColumnNode) left, formatter) + ")"; + } + Serializable right = node.getRight(); + if (right instanceof CharSequence) { + right = this.getSQLColumn(null, right.toString()); + } else if (left instanceof ColumnNode) { + right = "(" + formatSQLValue(attr, (ColumnNode) right, formatter) + ")"; + } + switch (node.getExpress()) { + case INC: + return new StringBuilder().append(left).append(" + ").append(right); + case MUL: + return new StringBuilder().append(left).append(" * ").append(right); + case DIV: + return new StringBuilder().append(left).append(" / ").append(right); + case MOD: + return new StringBuilder().append(left).append(" % ").append(right); + case AND: + return new StringBuilder().append(left).append(" & ").append(right); + case ORR: + return new StringBuilder().append(left).append(" | ").append(right); + } + throw new IllegalArgumentException(node + " express cannot be null or MOV"); + } + /** * 获取所有数据表字段的Attribute, 不包含@Transient字段 *