使用mybatis-plus更新空值无效的解决办法

情景需求:企业停产申请中,企业要填写停产的开始时间和结束时间,而停产结束时间是非必填字段,如果企业刚开始填写了停产结束时间,后来编辑的时候删除停产结束时间,保存之后还是会显示原来的停产时间

原因:

MyBatis-Plus 的默认字段策略是 NOT_NULL
这意味着在执行插入(INSERT)更新(UPDATE)操作时,如果实体类中的字段值为 null,则该字段不会被包含在生成的 SQL 语句中。只有那些非 null 的字段才会被插入或更新到数据库

情景复现
如图所示,如果一开始数据是这样的

在这里插入图片描述

但是当我清除停产结束时间然后保存,再次点击查看或者编辑停产结束时间还在,这当然不是我想要的结果

这是保存后打印在前端控制台的表单数据,endTime已经设置为null
在这里插入图片描述

在后台查看sql语句中的update语句时,并没有包含刚才的endTime的null值,欸?这是什么原因

UPDATE enterprise_operation SET enterprise_id='8ec4f5e16ff7497ebbcf58b24cfe6402', limit_type='All', start_time='2024-10-01 00:00:00.0', reason='国庆放假', project_id='972d5fdb-0b82-41c5-b42b-7cdc8556e24b', project_name='', status='edit', edited_by='9cfa5cf040a7427ab988e765e88a39fa', edited_time='2024-09-24 17:17:16.0' WHERE id='efe7ccc233b9dedb959828ba3c75f6f7'

这是我们一开始提到的,MyBatis-Plus 的默认字段策略是 NOT_NULL。也就是实体类中的字段值为 null,在插入或者更新的时候不会包含在sql语句中

那我们如何解决呢?
我们可以在实体类字段上的@TableField中添加updateStrategy = FieldStrategy.ALWAYS
在这里插入图片描述

ALWAYS:
当字段的更新策略设置为 ALWAYS 时,无论该字段的值是什么,MyBatis-Plus 都会在生成 SQL 更新语句时包含这个字段。
这意味着即使字段的值为 null 或空,它也会出现在 UPDATE 语句的 SET 子句中,并且会将数据库中对应的字段更新为 null 或空

这样再次保存就可以正常更新停产时间的值了,我们来看一下修改之后的update语句中,end_time=null已经包含在sql中了

UPDATE enterprise_operation SET enterprise_id='8ec4f5e16ff7497ebbcf58b24cfe6402', limit_type='All', start_time='2024-10-01 00:00:00.0', end_time=null, reason='国庆放假', project_id='972d5fdb-0b82-41c5-b42b-7cdc8556e24b', project_name='', status='edit', edited_by='9cfa5cf040a7427ab988e765e88a39fa', edited_time='2024-09-24 17:30:55.0' WHERE id='efe7ccc233b9dedb959828ba3c75f6f7'
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值