就是那个马冰冰 2021-06-01 11:01 采纳率: 57.1%
浏览 454
已结题

saveOrUpdate不支持置空.

为图方便和快速,使用的是mp框架.
大量的使用saveOrUpdate这个API,但是出现了一个问题.
有一个时间字段run_time.
我想要把这个字段置空.

我发现,我传{run_time:null}
并没有置空.而是放任不管.
查询之后,发现mp是有更新策略的.
只会更新非null字段.
 

所以我首先想到的就是,换一种更新策略.
于是使用了updateStrategy   IGNORED 的方式.

这种更新策略是,更新这个字段,无论他是什么都会更新.

 

皆大欢喜,但是,我偶然发现,有一次,我没传run_time字段,因为我这里并不关注他.

但mp却给我置空了.

 

这让我很郁闷.

 

我想要的效果明明很简单啊.

 

我不传的属性,你就别动.

我传了,传的值,你设置值,传的null,你置空,我传啥你设置啥.

 

这不是经典思维么.我说了你动,我没说你就别动.

 

怎么感觉mp所有策略都不支持这种呢?

 

求解决方案.

 

如果没有好的解决方案,我就只能把整个项目的saveOrUpdate替换成自定义的sql了.

但这个工作量太大了.是下下策,如果真没有方案了,再用这个.

有知道怎么解决的,还请不吝赐教,十分感谢

展开全部

  • 写回答

2条回答 默认 最新

  • 就是那个马冰冰 2021-06-08 02:03
    关注

    saveOrUpdate   是原生API

    会对实体进行更新或者保存.
    特点就是,如果实体没有主键,则是保存.

    如果有主键,则是更新.

    但更新也是有策略的.默认策略是,你实体里面的属性,不为null.

    则会帮你更新,以某个属性name为例.(age也行随意)"name=value".

    但如果你某个属性是name=null.

    则更新的时候就会忽略name这个属性.

    简单地说,默认策略是,帮你更新所有非null字段.

    所以我们使用另一种策略:忽略.

    当我们使用此策略.意味着,如果你是name属性是空.

    也会帮你更新name字段.

    简而言之,帮你更新所有字段.

    这会导致,我们传过来的实体你必须要为所有字段赋值.

    而你没赋值的属性,就是null.

    就会被莫名其妙的更新没了.

    根本达不到我们想要的效果.

    两种策略都不能完美复合我们的需求.(1.我传了,就更新,哪怕我传的null. 2.我不传,你就别动)

    我的解决方案是,分别使用两个请求,因为使用一个请求,始终无法满足两种策略.

    saveOrUpdate还使用默认的更新策略.即更新非空字段(满足条件2)
    另外手写setNull方法,用于满足1的需求.


     

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)
编辑
预览

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月10日

悬赏问题

  • ¥15 没输出运行不了什么问题
  • ¥20 输入import torch显示Intel MKL FATAL ERROR,系统驱动1%,: Cannot load mkl_intel_thread.dll.
  • ¥15 点云密度大则包围盒小
  • ¥15 nginx使用nfs进行服务器的数据共享
  • ¥15 C#i编程中so-ir-192编码的字符集转码UTF8问题
  • ¥15 51嵌入式入门按键小项目
  • ¥30 海外项目,如何降低Google Map接口费用?
  • ¥15 fluentmeshing
  • ¥15 手机/平板的浏览器里如何实现类似荧光笔的效果
  • ¥15 盘古气象大模型调用(python)
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部