diff --git a/src/org/redkale/source/ColumnExpress.java b/src/org/redkale/source/ColumnExpress.java index a6d24b5ac..dcfd6c807 100644 --- a/src/org/redkale/source/ColumnExpress.java +++ b/src/org/redkale/source/ColumnExpress.java @@ -22,6 +22,10 @@ public enum ColumnExpress { * 加值 col = col + val */ INC, + /** + * 加值 col = col - val + */ + DEC, /** * 乘值 col = col * val */ diff --git a/src/org/redkale/source/ColumnNodeValue.java b/src/org/redkale/source/ColumnNodeValue.java index 650da345e..21a827dd3 100644 --- a/src/org/redkale/source/ColumnNodeValue.java +++ b/src/org/redkale/source/ColumnNodeValue.java @@ -17,11 +17,11 @@ import static org.redkale.source.ColumnExpress.*; */ public class ColumnNodeValue implements Serializable { - private Serializable left;//类型只能是String、Number、ColumnNode + private Serializable left;//类型只能是String、Number、ColumnNodeValue private ColumnExpress express; //不能是MOV - private Serializable right;//类型只能是String、Number、ColumnNode + private Serializable right;//类型只能是String、Number、ColumnNodeValue public ColumnNodeValue() { } @@ -41,6 +41,10 @@ public class ColumnNodeValue implements Serializable { return new ColumnNodeValue(left, INC, right); } + public static ColumnNodeValue dec(Serializable left, Serializable right) { + return new ColumnNodeValue(left, DEC, right); + } + public static ColumnNodeValue mul(Serializable left, Serializable right) { return new ColumnNodeValue(left, MUL, right); } diff --git a/src/org/redkale/source/ColumnValue.java b/src/org/redkale/source/ColumnValue.java index 424ff33cd..4765c19fc 100644 --- a/src/org/redkale/source/ColumnValue.java +++ b/src/org/redkale/source/ColumnValue.java @@ -74,6 +74,18 @@ public class ColumnValue { return new ColumnValue(column, INC, value); } + /** + * 返回 {column} = {column} - {value} 操作 + * + * @param column 字段名 + * @param value 字段值 + * + * @return ColumnValue + */ + public static ColumnValue dec(String column, Serializable value) { + return new ColumnValue(column, DEC, value); + } + /** * 返回 {column} = {column} * {value} 操作 * diff --git a/src/org/redkale/source/EntityCache.java b/src/org/redkale/source/EntityCache.java index e5e275b92..337612ac7 100644 --- a/src/org/redkale/source/EntityCache.java +++ b/src/org/redkale/source/EntityCache.java @@ -622,6 +622,15 @@ public final class EntityCache { } } + public T updateColumnDecrement(final Serializable pk, Attribute attr, final long incvalue) { + if (pk == null) return null; + T rs = this.map.get(pk); + if (rs == null) return rs; + synchronized (rs) { + return updateColumn(attr, rs, ColumnExpress.DEC, incvalue); + } + } + private T updateColumn(Attribute attr, final T entity, final ColumnExpress express, Serializable val) { final Class ft = attr.type(); Number numb = null; @@ -695,6 +704,13 @@ public final class EntityCache { numb = numb.longValue() + ((Number) val).longValue(); } break; + case DEC: + if (numb == null) { + numb = (Number) val; + } else { + numb = numb.longValue() - ((Number) val).longValue(); + } + break; case MUL: if (numb == null) { numb = 0; diff --git a/src/org/redkale/source/EntityInfo.java b/src/org/redkale/source/EntityInfo.java index a142b5aac..415a8ab67 100644 --- a/src/org/redkale/source/EntityInfo.java +++ b/src/org/redkale/source/EntityInfo.java @@ -977,6 +977,8 @@ public final class EntityInfo { switch (cv.getExpress()) { case INC: return new StringBuilder().append(sqlColumn).append(" + ").append(val); + case DEC: + return new StringBuilder().append(sqlColumn).append(" - ").append(val); case MUL: return new StringBuilder().append(sqlColumn).append(" * ").append(val); case DIV: @@ -1013,6 +1015,8 @@ public final class EntityInfo { switch (node.getExpress()) { case INC: return new StringBuilder().append(left).append(" + ").append(right); + case DEC: + return new StringBuilder().append(left).append(" - ").append(right); case MUL: return new StringBuilder().append(left).append(" * ").append(right); case DIV: