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

https://github.com/baomidou/mybatis-plus/issues/6378
This commit is contained in:
nieqiurong 2024-08-07 17:26:56 +08:00
parent bcf95966ae
commit f7c685af46
3 changed files with 41 additions and 23 deletions

View File

@ -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));
});
}

View File

@ -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());
}
}

View File

@ -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 ?";