@CachePut 如何只更新 bean 中值不为 null 的属性

2018-09-17 20:22:57 +08:00
 zhady009
  @Override
//  @CacheEvict(key = "#root.targetClass.simpleName + #record.id")
  @CachePut(key = "#root.targetClass.simpleName + #record.id")
  public T updateById(T record) {
    baseMapper.updateByPrimaryKeySelective(record);
    return record;
  }

原本是更新数据就直接删除缓存 但是感觉不是合理 试了一下 CachePut 即使是 null 也会更新 不过后来想到应该可以用 condition 和 spel 来定制规则 但是又有新的问题 因为是通用 service 里面 具体的 bean 的是未知的 想不到有什么思路可以实现

3153 次点击
所在节点    Java
8 条回复
xuanbg
2018-09-17 20:36:31 +08:00
这个注解是没办法了,只能自己通过反射来解决
zjp
2018-09-17 21:13:53 +08:00
@CachePut( unless = "#record == null")
record 是泛型也能判空,有什么问题?
zhady009
2018-09-17 21:21:37 +08:00
@zjp record
比如是一个 User 里面有 username password 等属性
比如我只更新 password 其他的属性就会是 null 如何让他不更新 Null 的值
zjp
2018-09-17 21:50:10 +08:00
@zhady009 如果是 RedisCacheManager 之类的做不到,缓存的是序列化后的数据。用 ConcurrentMapCacheManager 好像也得手工操作… condition 和 unless 都只能用字符串配置
xbigfat
2018-09-17 22:38:17 +08:00
楼主你好,你讲的这个我刚刚好在写~按照我的理解来说,其实是一个 Query 操作。
给定一个 T element 对象,element 中填充了部分成员,返回一个 List<T> 中就是楼主需要的结果了。
首先要根据现有的 element 组成一个 SQL 语句,执行查询之后,返回到 ResultSet rs。
然后用这个 rs 生成 List<T> 即可;
我刚刚写到最后一步,就看到你的帖子了,希望对你有帮助~(这个最后一步我还没写好,但是是用反射,直接赋)
xbigfat
2018-09-17 22:41:38 +08:00
又看了一遍,如果我理解错了请轻拍。
zhady009
2018-09-18 00:18:00 +08:00
@xbigfat 如果要多一次查询的话那感觉还是更新数据的时候把缓存删了好

下一次查询 @Cacheable 也是这种效果, 我只是想减少一次对数据库的查询操作

不管怎么说感谢了
xbigfat
2018-09-18 00:49:18 +08:00
@zhady009
Sorry,刚刚查了一下 Cacheable 注解,原来是 Spring 的项目,我是一个 Android 开发者,最近刚学 J2EE 还在手写 ORM 阶段,没用过 Spring 所以。。你刚刚写的这个注解我没注意以为你 @的某个人,原来我们讨论的不是一个层次的问题。。看来是我想多啦~ Spring 我还不会

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/490210

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX