V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zhady009
V2EX  ›  Java

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

  •  
  •   zhady009 · 2018-09-17 20:22:57 +08:00 · 3124 次点击
    这是一个创建于 2019 天前的主题,其中的信息可能已经有所发展或是发生改变。
      @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 的是未知的 想不到有什么思路可以实现

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

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

    不管怎么说感谢了
    xbigfat
        8
    xbigfat  
       2018-09-18 00:49:18 +08:00
    @zhady009
    Sorry,刚刚查了一下 Cacheable 注解,原来是 Spring 的项目,我是一个 Android 开发者,最近刚学 J2EE 还在手写 ORM 阶段,没用过 Spring 所以。。你刚刚写的这个注解我没注意以为你 @的某个人,原来我们讨论的不是一个层次的问题。。看来是我想多啦~ Spring 我还不会
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3030 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 15:01 · PVG 23:01 · LAX 08:01 · JFK 11:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.