为图方便和快速,使用的是mp框架.
大量的使用saveOrUpdate这个API,但是出现了一个问题.
有一个时间字段run_time.
我想要把这个字段置空.
我发现,我传{run_time:null}
并没有置空.而是放任不管.
查询之后,发现mp是有更新策略的.
只会更新非null字段.
所以我首先想到的就是,换一种更新策略.
于是使用了updateStrategy IGNORED 的方式.
这种更新策略是,更新这个字段,无论他是什么都会更新.
皆大欢喜,但是,我偶然发现,有一次,我没传run_time字段,因为我这里并不关注他.
但mp却给我置空了.
这让我很郁闷.
我想要的效果明明很简单啊.
我不传的属性,你就别动.
我传了,传的值,你设置值,传的null,你置空,我传啥你设置啥.
这不是经典思维么.我说了你动,我没说你就别动.
怎么感觉mp所有策略都不支持这种呢?
求解决方案.
如果没有好的解决方案,我就只能把整个项目的saveOrUpdate替换成自定义的sql了.
但这个工作量太大了.是下下策,如果真没有方案了,再用这个.
有知道怎么解决的,还请不吝赐教,十分感谢
saveOrUpdate 是原生API
会对实体进行更新或者保存.
特点就是,如果实体没有主键,则是保存.
如果有主键,则是更新.
但更新也是有策略的.默认策略是,你实体里面的属性,不为null.
则会帮你更新,以某个属性name为例.(age也行随意)"name=value".
但如果你某个属性是name=null.
则更新的时候就会忽略name这个属性.
简单地说,默认策略是,帮你更新所有非null字段.
所以我们使用另一种策略:忽略.
当我们使用此策略.意味着,如果你是name属性是空.
也会帮你更新name字段.
简而言之,帮你更新所有字段.
这会导致,我们传过来的实体你必须要为所有字段赋值.
而你没赋值的属性,就是null.
就会被莫名其妙的更新没了.
根本达不到我们想要的效果.
两种策略都不能完美复合我们的需求.(1.我传了,就更新,哪怕我传的null. 2.我不传,你就别动)
我的解决方案是,分别使用两个请求,因为使用一个请求,始终无法满足两种策略.
saveOrUpdate还使用默认的更新策略.即更新非空字段(满足条件2)
另外手写setNull方法,用于满足1的需求.
没传run_time字段时,在代码层面,你的run_time字段值就是null,在执行过程中和传了null结果是一样的。加了ingore注解后,你的传参是什么,更新到数据库就是什么样的。 一种取巧的办法是
TableFiled注解使用notnull ,传入空字符串,代替null。
方法二:对于已经插入成功的实体,先get拿到,再修改部分,之后saveOrUpdate