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

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 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样