Browse Source

处理自增自减(负数)情况.

https://github.com/baomidou/mybatis-plus/issues/6378
nieqiurong 9 months ago
parent
commit
f7c685af46

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

@@ -111,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 instanceof BigDecimal ? ((BigDecimal) val).toPlainString() : val));
+            sqlSet.add(realColumn + Constants.EQUALS + realColumn  + Constants.SPACE + Constants.PLUS + Constants.SPACE + (val instanceof BigDecimal ? ((BigDecimal) val).toPlainString() : val));
         });
     }
 
@@ -135,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 instanceof BigDecimal ? ((BigDecimal) val).toPlainString() : val));
+            sqlSet.add(realColumn + Constants.EQUALS + realColumn + Constants.SPACE + Constants.DASH + Constants.SPACE + (val instanceof BigDecimal ? ((BigDecimal) val).toPlainString() : val));
         });
     }
 

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

@@ -28,31 +28,31 @@ class LambdaUpdateWrapperTest extends BaseWrapperTest {
     void testIncrByAndDecrBy() {
         LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
         wrapper.setIncrBy(true, User::getRoleId, 1).setDecrBy(true, User::getName, 1).eq(User::getId, 1);
-        Assertions.assertEquals("role_id=role_id+1,username=username-1", wrapper.getSqlSet());
+        Assertions.assertEquals("role_id=role_id + 1,username=username - 1", wrapper.getSqlSet());
 
         wrapper = new LambdaUpdateWrapper<>();
         wrapper.setIncrBy(User::getRoleId, 1).setIncrBy(User::getName, 1).eq(User::getId, 1);
-        Assertions.assertEquals("role_id=role_id+1,username=username+1", wrapper.getSqlSet());
+        Assertions.assertEquals("role_id=role_id + 1,username=username + 1", wrapper.getSqlSet());
 
         wrapper = new LambdaUpdateWrapper<>();
         wrapper.setIncrBy(false, User::getRoleId, 1).setIncrBy(User::getName, 1).eq(User::getId, 1);
-        Assertions.assertEquals("username=username+1", wrapper.getSqlSet());
+        Assertions.assertEquals("username=username + 1", wrapper.getSqlSet());
 
         wrapper = new LambdaUpdateWrapper<>();
         wrapper.setDecrBy(User::getRoleId, 1).setDecrBy(User::getName, 1).eq(false, User::getId, 1);
-        Assertions.assertEquals("role_id=role_id-1,username=username-1", wrapper.getSqlSet());
+        Assertions.assertEquals("role_id=role_id - 1,username=username - 1", wrapper.getSqlSet());
 
         wrapper = new LambdaUpdateWrapper<>();
         wrapper.setDecrBy(true, User::getRoleId, 1).setDecrBy(true, User::getName, 1).eq(false, User::getId, 1);
-        Assertions.assertEquals("role_id=role_id-1,username=username-1", wrapper.getSqlSet());
+        Assertions.assertEquals("role_id=role_id - 1,username=username - 1", wrapper.getSqlSet());
 
         wrapper = new LambdaUpdateWrapper<>();
         wrapper.setDecrBy(false, User::getRoleId, 1).setDecrBy(User::getName, 1).eq(User::getId, 1);
-        Assertions.assertEquals("username=username-1", wrapper.getSqlSet());
+        Assertions.assertEquals("username=username - 1", wrapper.getSqlSet());
 
         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());
+        Assertions.assertEquals("role_id=role_id - 1", wrapper.getSqlSet());
 
 
     }
@@ -61,60 +61,60 @@ class LambdaUpdateWrapperTest extends BaseWrapperTest {
     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());
+        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());
+        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());
+        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());
+        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());
+        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());
+        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());
+        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());
+        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());
+        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());
+        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());
+        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());
+        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());
+        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());
+        Assertions.assertEquals("role_id=role_id + 2340", wrapper.getSqlSet());
     }
 
 }

+ 18 - 0
mybatis-plus-core/src/test/java/com/baomidou/mybatisplus/test/JSqlParserTest.java

@@ -1,5 +1,6 @@
 package com.baomidou.mybatisplus.test;
 
+import net.sf.jsqlparser.JSQLParserException;
 import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
 import net.sf.jsqlparser.parser.CCJSqlParserUtil;
 import net.sf.jsqlparser.statement.delete.Delete;
@@ -29,6 +30,23 @@ class JSqlParserTest {
         System.out.println(e.getLeftExpression());
     }
 
+    @Test
+    void testDecr() throws JSQLParserException {
+        // 如果连一起 SqlParser 将无法解析 , 还有种处理方式就自减为负数的时候 转为 自增.
+        var parse1 = CCJSqlParserUtil.parse("UPDATE test SET a = a --110");
+        Assertions.assertEquals("UPDATE test SET a = a", parse1.toString());
+        var parse2 = CCJSqlParserUtil.parse("UPDATE test SET a = a - -110");
+        Assertions.assertEquals("UPDATE test SET a = a - -110", parse2.toString());
+    }
+
+    @Test
+    void testIncr() throws JSQLParserException {
+        var parse1 = CCJSqlParserUtil.parse("UPDATE test SET a = a +-110");
+        Assertions.assertEquals("UPDATE test SET a = a + -110", parse1.toString());
+        var parse2 = CCJSqlParserUtil.parse("UPDATE test SET a = a + -110");
+        Assertions.assertEquals("UPDATE test SET a = a + -110", parse2.toString());
+    }
+
     @Test
     void notLikeParser() throws Exception {
         final String targetSql = "SELECT * FROM tableName WHERE id NOT LIKE ?";