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 浏览: 79
你可以使用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 = 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 类型字段报错没有默认值的问题,如果字段为空就取dto.getMoney(),不为空就执行updateWrapper.setSql("turnover = turnover + " + dto.getMoney());
可以使用三目运算符来判断,如果 BigDecimal 字段不为空,则执行更新操作,否则将 dto.getMoney() 赋值给该字段。代码示例如下:
```
updateWrapper.setSql("turnover = turnover + " + (dto.getTurnover() != null ? dto.getTurnover() : dto.getMoney()));
```
同样的方法也可以用于 order_num 字段的更新,示例代码如下:
```
updateWrapper.setSql("order_num = order_num + " + (dto.getOrderNum() != null ? dto.getOrderNum() : 1));
```
这样做可以保证字段不为空,避免了出现报错的情况。
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'
```
阅读全文