【问题标题】:Getting key value from key of hazelcast IMap从 hazelcast IMap 的键中获取键值
【发布时间】:2017-04-05 10:22:06
【问题描述】:

我使用 spring 注释将我的对象放到 hazelcast 地图上:

@Cacheable(value = "cacheName", key = "{ #someId1,#someId2}")

public String generateValue(Long someId1, Long someId2)

我想根据 Imap 键上的条件使缓存中的对象无效。我发现 key 是一个大小等于 2 的 ArrayList。这是预期的结果。

 Set set = cache.keySet(); // this returns Set<ArrayList<Long>>

我尝试在键上设置条件:

EntryObject e = new PredicateBuilder().getEntryObject();
Predicate predicateKey = e.key().get("__key#get(0)").equal(someId1).and(e.get("__key#get(1)").equal(someId2));

但是调用这个谓词最终会失败:

Set<Long> idKeysToInvalidate = cache.keySet(predicateKey);

com.hazelcast.query.QueryException: java.lang.IllegalArgumentException: There is no suitable accessor for '__key#get(0)' on class 'class java.util.ArrayList'
at com.hazelcast.query.impl.getters.ReflectionHelper.createGetter(ReflectionHelper.java:176)

有人遇到过同样的问题吗?

【问题讨论】:

    标签: spring hazelcast


    【解决方案1】:

    我自己没有做过,至少在一个键上,但你可以试试__key#[0] 否则请看这里:http://docs.hazelcast.org/docs/3.8/manual/html-single/index.html#querying-in-collections-and-arrays

    【讨论】:

    • 您是否尝试过使用哈希符号?老实说,我不确定它是否有效。我的意思是作为键的集合不是最常见的情况:)
    【解决方案2】:

    我解决了如下问题:

        EntryObject e = new PredicateBuilder().getEntryObject();
        List<Long> input = Arrays.asList(someId1, someId2);
        Predicate predicateKey = e.key().get("hashCode").equal(input.hashCode());
        Set<List> idKeysToInvalidate = cache.keySet(predicateKey);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 2013-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多