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());
时间: 2023-12-03 20:42:55 浏览: 27
可以使用三目运算符来判断,如果 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));
```
这样做可以保证字段不为空,避免了出现报错的情况。
相关问题
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'
```