前言
需求: 移除企业;将ent_id设置为null
一、重现bug
1,使用updateById()更新单独个字段为空值,结果报错。
@Override
public void update(String id,String type) {
Student stu = new Student();
stu.setEntId(null); // 会报异常
stu.setId(id);
studentService.updateById(stu);
}
二、解决方法
方法1:@TableField(strategy= FieldStrategy.NOT_EMPTY)
方法2:@TableField(value = “ent_id”, fill = FieldFill.UPDATE)
entity
/**
* 所属企业id
*/
@TableField(strategy= FieldStrategy.NOT_EMPTY)
private String entId;
service
@Override
public void update(String id,String type) {
Student stu = new Student();
stu.setEntId(null); // 不报错
stu.setId(id);
studentService.updateById(stu);
}
补充:
有时候需要将数据库的某个字段由原来有值修改为空值。当调用mybatisplus提供修改方法studentService.saveOrUpdate(student)
; 遇到空值,它不做为修改字段。
/**
* 所属企业id
*/
@TableField(value = "ent_id",fill = FieldFill.UPDATE)
private String entId;
链接: (官网)插入或更新的字段有-空字符串-或者-null.
验证:字符串是可以直接赋值空,然后进行删除的。
if (CollectionUtil.isNotEmpty(idList)) {
List<PurchaseRequestItem> entList = Lists.newArrayList();
for (String id : idList) {
PurchaseRequestItem item = new PurchaseRequestItem();
item.setId(id);
item.setFbk2("");
entList.add(item);
}
purchaseRequestItemService.updateBatchById(entList);
System.out.println("12321"+entList);
}
总结
1,使用mybatisplus的置空方法作用不大,因为一个entity有可能涉及到多个业务层的使用,推荐还是自己写sql。
即如果当前用户被移除企业的时候,就调用Dao的修改方法,将企业id设置为null值。
2,查阅资料,得知mybatisplus不支持修改空值。
如果需要修改为空值,需要用到主键@TableField(strategy=FieldStrategy.NOT_EMPTY)
(2022年8月5日 第1点的补充)
3,fill = FieldFill.UPDATE 这个可以实现空值修改
(2022年8月22日)
4,发现:mybatisplus 空值修改发现一个规律:String类型赋值“”,是可以直接修改的;只有Date类型,BigDecimal类型,Integer类型等遇到空值(null、“”)的赋值不会作为修改字段。–2023年8月23日 验证+1