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

被折叠的 条评论
为什么被折叠?



