当前位置: 首页 > news >正文

Spring Boot+MyBatis Plus指定属性允许更新为 null,需设置更新策略,字段更新为 ALWAYS,updateStrategy = FieldStrategy.ALWAYS

实体类设置

/** * 使用人 */ @TableField(value = "cad_Person", updateStrategy = FieldStrategy.ALWAYS) // 允许更新为 null,需设置更新策略,字段更新为 ALWAYS @Size(max = 20) private String userPerson; /** * 使用人姓名 */ @TableField(value = "cad_PersonName", updateStrategy = FieldStrategy.ALWAYS) // 允许更新为 null,需设置更新策略,字段更新为 ALWAYS @Size(max = 50) private String userMoniker;

服务层

/** * 保存资金分配明细列表 */ public void saveDetailList(List<CapitalAllocateDetailUpdateDTO> updateDTOs) { // 预加载全部用户 List<User> users = userService.queryUserListByCommand("all",0); // List -> Map Map<String, String> userMap = new HashMap<>(); users.forEach(user -> userMap.put(user.getUserName(), user.getMoniker())); // DTO -> Entity List<CapitalAllocateDetail> details = updateDTOs.stream() .map(dto -> { CapitalAllocateDetail entity = new CapitalAllocateDetail(); entity.setId(dto.getId()); // 允许更新为 null,实体类中已经设置更新策略,字段更新为 ALWAYS,updateStrategy = FieldStrategy.ALWAYS entity.setUserPerson(dto.getUserPerson()); // 允许更新为 null,实体类中已经设置更新策略,字段更新为 ALWAYS,updateStrategy = FieldStrategy.ALWAYS entity.setUserMoniker(userMap.get(dto.getUserPerson())); return entity; }) .toList(); allocateDetailMapper.updateById(details, 100); }

要使UserPerson字段在值为null时也能更新到数据库(即将数据库中的对应字段置为null),您需要修改 MyBatis Plus 的字段更新策略。当前默认策略为NOT_NULL,即忽略null值,因此即使实体中设置了null,也不会生成更新 SQL。

解决方案

在实体类CapitalAllocateDetailuserPerson字段上添加@TableField注解,并设置updateStrategyFieldStrategy.ALWAYSFieldStrategy.IGNORED

java

@TableField(value = "cad_Person", updateStrategy = FieldStrategy.ALWAYS) @Size(max = 20) private String userPerson;
  • ALWAYS:无论字段值是否为null,都参与更新。

  • IGNORED:忽略判断,总是更新(与ALWAYS效果相同,但IGNORED也会忽略其他策略)。

同理,如果希望在userPersonnull时也更新userMonikernull(因为userMap.get(null)返回null),也需要为userMoniker字段配置相同的策略:

java

@TableField(value = "cad_PersonName", updateStrategy = FieldStrategy.ALWAYS) @Size(max = 50) private String userMoniker;

注意事项

  1. 仅影响指定字段:其他字段保持默认策略,更新时仍会忽略null值,避免误更新。

  2. 自定义批量更新方法:您的方法中使用了allocateDetailMapper.updateById(details, 100),请确保该自定义方法内部使用了 MyBatis Plus 的通用update方法(如updateById)或正确处理了字段策略。如果该方法是自己写的 SQL,可能需要手动判断null值。

  3. 代码逻辑调整:当前代码中,userMoniker完全依赖于userPerson。如果希望userPersonnull时不更新userMoniker(即保留原值),则需修改流式处理逻辑,仅在dto.getUserPerson() != null时设置userMoniker,否则不设置(保持实体中该字段为null,但利用策略忽略更新)。不过这与您“也更新”的需求不符,请根据业务确定。

全局配置(可选)

如果您希望所有字段都允许更新null,可以在application.yml中配置全局策略:

yaml

mybatis-plus: global-config: db-config: update-strategy: ignored

但此方式影响范围大,不推荐。

验证

修改后,当dto.getUserPerson() == null时,生成的更新 SQL 应包含cad_Person = null(及可能包含cad_PersonName = null),从而将数据库字段更新为null

http://www.jsqmd.com/news/467539/

相关文章:

  • CentOS 8 SFTP配置避坑指南:从权限设置到chroot环境完整流程
  • Z-Image-Turbo企业应用:WMS系统集成方案
  • CYBER-VISION零号协议Java开发指南:SpringBoot微服务集成
  • Linux下wget下载失败?手把手教你修改DNS解决‘无法解析主机地址‘问题
  • Qwen-Image-2512-Pixel-Art-LoRA效果对比:与Stable Diffusion Pixel LoRA生成质量横向评测
  • ComfyUI作品集:看看大神们用节点工作流生成的惊艳AI画作
  • 从零解析稚晖君dummy机械臂CAN通信代码(一)
  • SpringBoot集成RocketMQ:从基础配置到消息注解实战指南
  • CPU缓存揭秘:为什么L1和L2缓存对游戏性能影响这么大?(附实测数据)
  • PCIe设备识别实战:从BAR配置到LTSSM状态机全解析(附Linux驱动代码片段)
  • EVA-01实操手册:自定义NERV战术指令模板库与批量图像分析脚本
  • 实战指南:如何在STM32上高效集成MAVLink协议实现无人机通信
  • Arduino与HX1838红外接收模块实战:打造智能LED遥控系统
  • Cloudflare R2图床实战:如何用自定义域名绕过国内访问限制(附PicList配置)
  • MySQL空间数据处理实战:基于WKT与MyBatis-Plus的几何类型转换方案
  • 基于STM32的嵌入式设备集成M2LOrder:边缘计算情感交互方案
  • 别再手动画分镜了!实测‘创绘’AI如何批量生成小说漫画,解放你的生产力
  • 不用Root也能抓包?2024最新版HttpCanary非越狱设备完整配置指南
  • 解决coc.nvim中clangd报错的完整指南(含手动安装12.0.1版本)
  • GLM-4-9B-Chat-1M在内网穿透技术中的应用
  • GRPO算法解析:如何通过群体样本革新强化学习优化范式
  • Python自动化办公:利用win32com实现批量doc转docx的高效方案
  • Storm流计算实战:从RocketMQ到本地控制台的完整数据处理流程(附代码)
  • 百度网盘Cookie获取全攻略:从手动到自动的三种高效方法(附避坑指南)
  • 2024年最值得入手的5个GPU租用平台:实测性能与性价比对比
  • 『深度解析』吴恩达揭秘AI Agent四大设计模式:从理论到实践
  • DDColor应用案例:修复家族老照片,让黑白记忆变成彩色珍藏
  • 如何用GPT-4o和CLIP构建遥感图像知识图谱?手把手教你实现多模态语义理解
  • 类加载器泄漏案例:Tomcat 热部署 + ThreadLocal 误用(未调用remove())
  • 为什么92%的MCP项目在UAT通过却在生产凌晨告警?——深度拆解本地连接器在K8s DaemonSet模式下的时钟偏移与证书续期断连黑盒