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

Mybatisplus 如何将已经有值的字段设置为空值null

终极推荐方式:
        UpdateWrapper<SkuDO> wrapper = new UpdateWrapper<>();wrapper.lambda().set(Objects.isNull(dto.getWeights()), SkuDO::getWeights, null).set(Objects.isNull(dto.getShelfLife()), SkuDO::getShelfLife, null).eq(PurchaseSkuDO::getId, dto.getId()).eq(SkuDO::getIsDeleted, DeletedEnum.NORMAL.getCode());int update = this.getBaseMapper().update(skuDO, wrapper);
                LambdaUpdateWrapper<SpuDO> lambdaUpdate = new LambdaUpdateWrapper<>();lambdaUpdate.set(Objects.isNull(spuDO.getProvinceCode()),SpuDO::getProvinceCode, null);lambdaUpdate.set(Objects.isNull(spuDO.getProvinceName()),SpuDO::getProvinceName, null);lambdaUpdate.eq(SpuDO::getId, spuDO.getId());spuDao.update(spuDO, lambdaUpdate);

上面两种写法,其实是一种写法。都非常的推荐。本质就是显示设置需要更新为null的字段。亲测有效,无坑。

错误使用方式分析:

  1. 为何直接使用:spuDao.updateById(spuDO)、spuDao.saveOrUpdate(spuDO)不行:这个问题的核心原因是:MyBatis-Plus 的 saveOrUpdate updateById 方法(底层依赖 BaseMapper)在执行更新操作时,默认会忽略 null 值字段,只更新非 null 的属性。
  2. 为何使用下面对的方式也不行:原因是MyBatis-Plus 中 update(T entity, Wrapper<T> wrapper) 的字段过滤规则是:无论是否 “显式赋值 null”,只要字段策略是 NOT_NULL(默认),都会过滤所有 null 字段—— 它不会区分 “主动设为 null” 和 “未赋值 null”,只要值是 null,就不加入 SET 子句。

    // 1. 构建 spuDo:需要更新的字段(包括要设为 null 的字段)直接设为 null,其他字段设为目标值
    SpuDO spuDo = new SpuDO();
    spuDo.setId(1L); // 主键(必须有,用于匹配要更新的记录)
    spuDo.setName(null); // 要更新为 null 的字段
    spuDo.setPrice(new BigDecimal("5999")); // 要更新的非 null 字段
    spuDo.setStatus(1); // 其他需要更新的字段// 2. 构建 LambdaUpdateWrapper:仅保留 where 条件(不写 set 方法)
    LambdaUpdateWrapper<SpuDO> lambdaUpdate = new LambdaUpdateWrapper<>();
    lambdaUpdate.eq(SpuDO::getId, spuDo.getId()); // 唯一条件:匹配 id = ?(也可加其他条件)// 3. 执行更新:spuDo 传非 null,lambdaUpdate 仅含 where 条件
    spuDao.update(spuDo, lambdaUpdate);
  3. @TableField(updateStrategy = IGNORED) 这种方式可以。但是非常非常不建议使用:使用 @TableField(updateStrategy = IGNORED) 确实能解决 “null 字段无法更新” 的问题,但它会改变字段的默认更新行为,如果不注意业务场景,容易踩坑,核心风险是 “误覆盖数据库已有值

 

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

相关文章:

  • 2025 年上海商用净水器租赁公司最新推荐榜,技术实力与市场口碑深度解析,助力精准选品工厂,事业单位,办公净水器租赁企业
  • 云原生周刊:KubeVela 1.10.4 与 k0s 1.34 发布
  • 2025年尼龙拉链供货厂家权威推荐榜单:树脂拉链/金属拉链/隐形拉链源头厂家精选
  • 详细介绍:MySQL主从复制:数据同步实战指南
  • wzy
  • 2025年组合型铝合金桥架供货厂家权威推荐榜单:组合式铝合金桥架/阻燃铝合金桥架/专业生产铝合金桥架源头厂家精选
  • 25fall做题记录 - November - Amy
  • YACS2025年10月乙组
  • Google Driver 读写 excel
  • 2025年河南镶牙机构权威推荐榜单:河南老人镶牙机构源头精选
  • Windows11升级专业版密钥
  • 分享一个自动化进行Oracle 重做日志组管理的脚本
  • 强化学习值函数与策略搜索两种方法对比和疑问解读
  • 中文分词手艺全解析
  • 2025qwb 线上赛wp
  • 2025年钢带波纹管批发厂家权威推荐榜单:hdpe钢带波纹管/钢带管/钢带增强聚乙烯螺旋波纹管源头厂家精选
  • 11.4每日总结
  • 深入解析:探索大语言模型(LLM):一文读懂通用大模型的定义、特点与分类
  • 2025年聚氨酯预聚体公司新排行榜,浇注聚氨酯原材料企业推荐
  • 2025年乐博智家保鲜盒直销厂家权威推荐榜单:乐博智家冰沙杯/乐博智家炒冰机/乐博智家刨冰机源头厂家精选
  • 2025 年打标机厂家最新推荐排行榜:结合协会测评权威数据,聚焦技术创新与行业适配的优质品牌全解析手持/点阵/金属/铭牌打标机公司推荐
  • 2025年注射成型烧结炉生产厂商新排行榜,碳化硅反应烧结炉厂家推荐
  • 多项式学习小记
  • Oracle Exadata存储节点主动替换磁盘最佳实践
  • 计算机视觉的数据收集与标注 - 实践
  • 2025年东北围挡租售公司口碑排名:八达围挡租售基地
  • 训练现象
  • 2025年五大豪宅床垫源头工厂推荐,实力品牌全解析
  • AI驱动全链路监测精确防护:构建新一代政务数据安全平台
  • 河北金属家具企业口碑排名:河北优美金属客户评价如何?