(随笔)记录MP update()无法置空字段的问题

发布时间 2023-09-13 15:32:54作者: Joseph·Jonardo

问题

在code编写的时候有遇到需求,即保存或更新操作之前需要对reason和medication_receipt字段进行清空操作,确保一条数据中这两个字段不能同时有值,由于是Springboot+Mybatpis Plus的框架,因此第一反应是通过mp的update方法进行更新操作。

for (FollowupPapRecordDetail followupPapRecordDetail : details) {
    if (this.getById(followupPapRecordDetail.getId()) != null) {
        FollowupPapRecordDetail entity = new FollowupPapRecordDetail();
        // 删除字段
        entity.setReason(null);
        entity.setMedicationReceipt(null);
        // 其他字段...

        UpdateWrapper<FollowupPapRecordDetail> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", followupPapRecordDetail.getId());
        
        followupPapRecordDetailService.update(entity, updateWrapper);
    }
}

但是执行结果却有问题,对应的reason和medication_receipt字段并没有被更新

原因

在MyBatis-Plus中,如果你将字段的值设置为null,那么该字段将不会被更新。因此,在更新时,只有那些非null的字段才会被更新。

解决方法

method 1

  • 对于 String 类型的字段,可以将其赋值为空字符串("")来作为修改字段的值。
  • 对于 Date、BigDecimal 和 Integer 等非字符串类型的字段,如果将其赋值为 null 或空值(""),它们不会作为修改字段的值。

对于这些非字符串类型的字段,可以通过设置特定的默认值或使用特定方法来实现空值的修改。例如,对于 Date 类型的字段,可以通过设置一个默认的“空日期”(如 1900-01-01)来表示空值。对于 BigDecimal 类型的字段,您可以将其赋值为 BigDecimal.ZERO 来表示空值。

method 2

手动在mapper层构建键sql语句进行调用