LambdaUpdateWrapper<StatTurnoverHour> updateWrapper = Wrappers.lambdaUpdate(); updateWrapper.setSql("turnover = turnover + " + dto.getMoney()); updateWrapper.setSql("order_num = order_num + " + dto.getOrderNum()); updateWrapper.eq(StatTurnoverHour::getStoreId, dto.getStoreId()); updateWrapper.eq(StatTurnoverHour::getHourTime, dto.getHourTime()); updateWrapper.eq(StatTurnoverHour::getPayTime, dto.getPayTime());解决 BigDecimal 类型字段报错没有默认值的问题,如果turnover为空就取dto.getMoney(),不为空就执行updateWrapper.setSql("turnover = turnover + " + dto.getMoney());
时间: 2023-12-03 18:42:59 浏览: 76
你可以使用Java的三目运算符来实现这个逻辑,如下所示:
```
updateWrapper.setSql("turnover = " + (updateWrapper.getSqlSegment().contains("turnover") ? "turnover + " : "") + dto.getMoney());
```
这段代码中,首先判断`updateWrapper`对象中是否已经设置了`turnover`字段的更新语句,如果已经设置了,就在其后面加上`+ dto.getMoney()`;如果没有设置,则直接将`dto.getMoney()`赋值给`turnover`字段。这样就可以避免BigDecimal类型字段报错没有默认值的问题了。
相关问题
LambdaUpdateWrapper<StatTurnoverHour> updateWrapper = Wrappers.lambdaUpdate(); updateWrapper.setSql("turnover = " + (updateWrapper.getSqlSegment().contains("turnover") ? "turnover + " : "") + dto.getMoney()); updateWrapper.setSql("order_num = order_num + " + dto.getOrderNum()); updateWrapper.eq(StatTurnoverHour::getStoreId, dto.getStoreId()); updateWrapper.eq(StatTurnoverHour::getHourTime, dto.getHourTime()); updateWrapper.eq(StatTurnoverHour::getPayTime, dto.getPayTime()); boolean b = this.saveOrUpdate(statTurnoverHour, updateWrapper);解决 BigDecimal 类型字段报错没有默认值的问题,如果turnover为空就取dto.getMoney(),不为空就执行updateWrapper.setSql("turnover = turnover + " + dto.getMoney());
可以尝试如下代码来解决BigDecimal类型字段报错没有默认值的问题:
```
LambdaUpdateWrapper<StatTurnoverHour> updateWrapper = Wrappers.lambdaUpdate();
updateWrapper.set(StatTurnoverHour::getTurnover, dto.getMoney(), StringUtils.isNotBlank(dto.getMoney()));
updateWrapper.setSql("order_num = order_num + " + dto.getOrderNum());
updateWrapper.eq(StatTurnoverHour::getStoreId, dto.getStoreId());
updateWrapper.eq(StatTurnoverHour::getHourTime, dto.getHourTime());
updateWrapper.eq(StatTurnoverHour::getPayTime, dto.getPayTime());
boolean b = this.saveOrUpdate(statTurnoverHour, updateWrapper);
```
这里使用 `set` 方法来设置 `turnover` 字段的值,如果 `dto.getMoney()` 不为空,则设置为该值,否则不设置。同时,保留了 `order_num` 字段的更新方式。
StatTurnoverHour statTurnoverHour = new StatTurnoverHour(); statTurnoverHour.setStoreId(dto.getStoreId()); statTurnoverHour.setHourTime(dto.getHourTime()); statTurnoverHour.setPayTime(dto.getPayTime()); statTurnoverHour.setTurnover(dto.getMoney()); statTurnoverHour.setOrderNum(dto.getOrderNum()); LambdaUpdateWrapper<StatTurnoverHour> updateWrapper = Wrappers.lambdaUpdate(); updateWrapper.setSql("turnover = turnover + " + dto.getMoney()); updateWrapper.setSql("order_num = order_num + " + dto.getOrderNum()); updateWrapper.eq(StatTurnoverHour::getStoreId, dto.getStoreId()); updateWrapper.eq(StatTurnoverHour::getHourTime, dto.getHourTime()); updateWrapper.eq(StatTurnoverHour::getPayTime, dto.getPayTime()); boolean b = this.saveOrUpdate(statTurnoverHour, updateWrapper);执行的sql:update stat_turnover_hour set order_num = 1, turnover = 1.00, hour_time = 11, pay_time = TIMESTAMP '2023-05-23 00:00:00.000', storeId = 215, turnover = turnover + 1.00, order_num = order_num + 1 where storeId = 215 and hour_time = 11 and pay_time = TIMESTAMP '2023-05-23 00:00:00.000',怎么让order_num = 1, turnover = 1.00不存在sql
在你的代码中,有两个地方使用了`setSql`方法,这个方法会将整个SQL语句进行替换,因此第一个`setSql`设置的`turnover`字段的更新操作被第二个`setSql`覆盖掉了,最终执行的SQL语句只包含了`order_num`字段的更新操作,没有包含`turnover`字段的更新操作。为了解决这个问题,你可以将这两个更新操作合并成一个,如下所示:
```
LambdaUpdateWrapper<StatTurnoverHour> updateWrapper = Wrappers.lambdaUpdate();
updateWrapper.set(StatTurnoverHour::getOrderNum, StatTurnoverHour::getOrderNum.plus(dto.getOrderNum()));
updateWrapper.set(StatTurnoverHour::getTurnover, StatTurnoverHour::getTurnover.plus(dto.getMoney()));
updateWrapper.eq(StatTurnoverHour::getStoreId, dto.getStoreId());
updateWrapper.eq(StatTurnoverHour::getHourTime, dto.getHourTime());
updateWrapper.eq(StatTurnoverHour::getPayTime, dto.getPayTime());
boolean b = this.saveOrUpdate(statTurnoverHour, updateWrapper);
```
这样,`set`方法会将更新操作添加到更新语句中,而不是直接替换整个SQL语句。执行的SQL语句应该是这样的:
```
update stat_turnover_hour
set order_num = order_num + 1.00, turnover = turnover + 1.00
where storeId = 215 and hour_time = 11 and pay_time = TIMESTAMP '2023-05-23 00:00:00.000'
```
阅读全文