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

saveOrUpdate不支持置空.

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

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

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

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

 

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

但mp却给我置空了.

 

这让我很郁闷.

 

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

 

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

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

 

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

 

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

 

求解决方案.

 

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

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

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

  • 写回答

2条回答 默认 最新

  • 就是那个马冰冰 2021-06-08 10: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日

悬赏问题

  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助
  • ¥15 STM32控制MAX7219问题求解答