Selaa lähdekoodia

支持一下自增自减使用BigDecimal的少数情况.

https://github.com/baomidou/mybatis-plus/issues/6061
nieqiurong 1 vuosi sitten
vanhempi
commit
a8c4e912f9

+ 2 - 0
mybatis-plus-core/build.gradle

@@ -8,4 +8,6 @@ dependencies {
     implementation "${lib.'imadcn'}"
     implementation "${lib.'mybatis-ehcache'}"
     implementation "${lib.'mybatis-redis'}"
+
+    testImplementation "${lib.'logback-classic'}"
 }

+ 3 - 2
mybatis-plus-core/src/main/java/com/baomidou/mybatisplus/core/conditions/update/LambdaUpdateWrapper.java

@@ -23,6 +23,7 @@ import com.baomidou.mybatisplus.core.toolkit.Constants;
 import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
@@ -110,7 +111,7 @@ public class LambdaUpdateWrapper<T> extends AbstractLambdaWrapper<T, LambdaUpdat
     public LambdaUpdateWrapper<T> setIncrBy(boolean condition, SFunction<T, ?> column, Number val) {
         return maybeDo(condition, () -> {
             String realColumn = columnToString(column);
-            sqlSet.add(realColumn + Constants.EQUALS + realColumn + Constants.PLUS + val);
+            sqlSet.add(realColumn + Constants.EQUALS + realColumn + Constants.PLUS + (val instanceof BigDecimal ? ((BigDecimal) val).toPlainString() : val));
         });
     }
 
@@ -134,7 +135,7 @@ public class LambdaUpdateWrapper<T> extends AbstractLambdaWrapper<T, LambdaUpdat
     public LambdaUpdateWrapper<T> setDecrBy(boolean condition, SFunction<T, ?> column, Number val) {
         return maybeDo(condition, () -> {
             String realColumn = columnToString(column);
-            sqlSet.add(realColumn + Constants.EQUALS + realColumn + Constants.DASH + val);
+            sqlSet.add(realColumn + Constants.EQUALS + realColumn + Constants.DASH + (val instanceof BigDecimal ? ((BigDecimal) val).toPlainString() : val));
         });
     }
 

+ 64 - 0
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/core/conditions/LambdaUpdateWrapperTest.java

@@ -10,6 +10,8 @@ import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.Test;
 
+import java.math.BigDecimal;
+
 /**
  * @author miemie
  * @since 2021-01-27
@@ -51,6 +53,68 @@ class LambdaUpdateWrapperTest extends BaseWrapperTest {
         wrapper = new LambdaUpdateWrapper<>();
         wrapper.setDecrBy(User::getRoleId, 1).setDecrBy(false, User::getName, 1).eq(User::getId, 1);
         Assertions.assertEquals("role_id=role_id-1", wrapper.getSqlSet());
+
+
+    }
+
+    @Test
+    void testIncrByAndDecrByBigDecimal() {
+        var wrapper = new LambdaUpdateWrapper<User>();
+        wrapper.setDecrBy(User::getRoleId, new BigDecimal("1")).eq(User::getId, 1);
+        Assertions.assertEquals("role_id=role_id-1", wrapper.getSqlSet());
+
+        wrapper = new LambdaUpdateWrapper<>();
+        wrapper.setDecrBy(User::getRoleId, new BigDecimal(1)).eq(User::getId, 1);
+        Assertions.assertEquals("role_id=role_id-1", wrapper.getSqlSet());
+
+        wrapper = new LambdaUpdateWrapper<>();
+        wrapper.setDecrBy(User::getRoleId, new BigDecimal(1.0000)).eq(User::getId, 1);
+        Assertions.assertEquals("role_id=role_id-1", wrapper.getSqlSet());
+
+        wrapper = new LambdaUpdateWrapper<>();
+        wrapper.setDecrBy(User::getRoleId, new BigDecimal("1.0000")).eq(User::getId, 1);
+        Assertions.assertEquals("role_id=role_id-1.0000", wrapper.getSqlSet());
+
+        wrapper = new LambdaUpdateWrapper<>();
+        wrapper.setDecrBy(User::getRoleId, new BigDecimal(0.01)).eq(User::getId, 1);
+        Assertions.assertEquals("role_id=role_id-" + new BigDecimal(0.01), wrapper.getSqlSet());
+
+        wrapper = new LambdaUpdateWrapper<>();
+        wrapper.setDecrBy(User::getRoleId, new BigDecimal("0.01")).eq(User::getId, 1);
+        Assertions.assertEquals("role_id=role_id-0.01", wrapper.getSqlSet());
+
+        wrapper = new LambdaUpdateWrapper<>();
+        wrapper.setDecrBy(User::getRoleId, new BigDecimal("2340").setScale(-1)).eq(User::getId, 1);
+        Assertions.assertEquals("role_id=role_id-2340", wrapper.getSqlSet());
+
+
+        wrapper = new LambdaUpdateWrapper<>();
+        wrapper.setIncrBy(User::getRoleId, new BigDecimal("1")).eq(User::getId, 1);
+        Assertions.assertEquals("role_id=role_id+1", wrapper.getSqlSet());
+
+        wrapper = new LambdaUpdateWrapper<>();
+        wrapper.setIncrBy(User::getRoleId, new BigDecimal(1)).eq(User::getId, 1);
+        Assertions.assertEquals("role_id=role_id+1", wrapper.getSqlSet());
+
+        wrapper = new LambdaUpdateWrapper<>();
+        wrapper.setIncrBy(User::getRoleId, new BigDecimal(1.0000)).eq(User::getId, 1);
+        Assertions.assertEquals("role_id=role_id+1", wrapper.getSqlSet());
+
+        wrapper = new LambdaUpdateWrapper<>();
+        wrapper.setIncrBy(User::getRoleId, new BigDecimal("1.0000")).eq(User::getId, 1);
+        Assertions.assertEquals("role_id=role_id+1.0000", wrapper.getSqlSet());
+
+        wrapper = new LambdaUpdateWrapper<>();
+        wrapper.setIncrBy(User::getRoleId, new BigDecimal(0.01)).eq(User::getId, 1);
+        Assertions.assertEquals("role_id=role_id+" + new BigDecimal(0.01), wrapper.getSqlSet());
+
+        wrapper = new LambdaUpdateWrapper<>();
+        wrapper.setIncrBy(User::getRoleId, new BigDecimal("0.01")).eq(User::getId, 1);
+        Assertions.assertEquals("role_id=role_id+0.01", wrapper.getSqlSet());
+
+        wrapper = new LambdaUpdateWrapper<>();
+        wrapper.setIncrBy(User::getRoleId, new BigDecimal("2340").setScale(-1)).eq(User::getId, 1);
+        Assertions.assertEquals("role_id=role_id+2340", wrapper.getSqlSet());
     }
 
 }