Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法从Hazelcast';检索元素;如果使用自定义对象作为键,则为s映射_Hazelcast_Hazelcast Imap - Fatal编程技术网

无法从Hazelcast';检索元素;如果使用自定义对象作为键,则为s映射

无法从Hazelcast';检索元素;如果使用自定义对象作为键,则为s映射,hazelcast,hazelcast-imap,Hazelcast,Hazelcast Imap,我正在使用Hazelast Map,并试图根据key存储对象,key是我自定义类的对象,即HMapKey。下面是HMapKey类的片段 public class HMapKey implements Serializable{ private String keyCode; private long time; public HMapKey(String keyCode, long time) { this.keyCode = keyCode;

我正在使用Hazelast Map,并试图根据key存储对象,key是我自定义类的对象,即
HMapKey
。下面是
HMapKey
类的片段

public class HMapKey implements Serializable{
    private String keyCode;
    private long time;

    public HMapKey(String keyCode, long time) {
      this.keyCode = keyCode;
      this.time = time;
    }
    public String getKeyCode() {
        return keyCode;
    }
    public void setKeyCode(String keyCode) {
        this.keyCode = keyCode;
    }
    public long getTime() {
        return time;
    }
    public void setTime(long time) {
        this.time = time;
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((keyCode == null) ? 0 : keyCode.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        HMapKey other = (HMapKey) obj;
        if (keyCode == null) {
            if (other.keyCode != null)
                return false;
        } else if (!keyCode.equals(other.keyCode))
            return false;
        return true;
    }
}
正如您在上面的代码中所看到的,我在equals()方法中只使用了
keyCode
。因此,无论
时间
变量的值是多少。
但是当我使用这个对象作为Hazelcast映射中的键,并试图检索它时,我认为Hazelcast会检查键类的每个变量,因此,即使我有相同的
keyCode
变量值和不同的
time
变量,Hazelcast也会将我返回为
NULL
。是否有任何配置告诉Hazelcast不要进行所有变量检查,只使用现有的
equals()
方法

下面是我如何尝试从地图检索数据的代码

HazelcastInstance instance = Hazelcast.newHazelcastInstance();
private static ConcurrentMap<HMapKey, String>   testMap = instance.getMap("TEST_MAP");
testMap.put(new HMapKey("code1",123), "This is Code 1");
System.out.println(testMap.get(new HMapKey("code1",0)));
HazelcastInstance=Hazelcast.newHazelcastInstance();
私有静态ConcurrentMap testMap=instance.getMap(“TEST_-MAP”);
put(新的HMapKey(“代码1”,123),“这是代码1”);
System.out.println(testMap.get(新的HMapKey(“code1”,0));

意味着,在插入时,我创建了键对象,如
new-HMapKey(“code1”,123)
,但在检索它时,我创建了新对象,如
new-HMapKey(“code1”,0)
,这将我作为空值返回。然而,如果我尝试使用
新的HMapKey(“code1”,123)
它工作得很好。

首先,当你说“我尝试检索它”时,我不知道你想做什么

如果在get方法中使用密钥,则一切正常:

@Test
public void test() {
    HazelcastInstance hz = createHazelcastInstance();

    IMap<HMapKey, Integer> map = hz.getMap("aaa");
    HMapKey key = new HMapKey();
    key.keyCode = "code1";
    key.time = 123;

    HMapKey key2 = new HMapKey();
    key2.keyCode = "code2";
    key2.time = 246;

    map.put(key, 1);
    map.put(key2, 2);

    int value = map.get(key);
    assertEquals(value, 1);
}
@测试
公开无效测试(){
HazelcastInstance hz=createHazelcastInstance();
IMap map=hz.getMap(“aaa”);
HMapKey=新的HMapKey();
key.keyCode=“code1”;
key.time=123;
HMapKey key2=新的HMapKey();
key2.keyCode=“代码2”;
键2.time=246;
地图放置(图例1);
地图放置(键2,2);
int value=map.get(键);
资产质量(价值1);
}
如果要基于整个键值检索值,HMapKey需要实现
Comparable

然后您可以这样查询:


map.values(谓词.equal(“_键”,yourHKMapKeyInstance))

首先,当你说“我试图检索它”时,我不知道你想做什么

如果在get方法中使用密钥,则一切正常:

@Test
public void test() {
    HazelcastInstance hz = createHazelcastInstance();

    IMap<HMapKey, Integer> map = hz.getMap("aaa");
    HMapKey key = new HMapKey();
    key.keyCode = "code1";
    key.time = 123;

    HMapKey key2 = new HMapKey();
    key2.keyCode = "code2";
    key2.time = 246;

    map.put(key, 1);
    map.put(key2, 2);

    int value = map.get(key);
    assertEquals(value, 1);
}
@测试
公开无效测试(){
HazelcastInstance hz=createHazelcastInstance();
IMap map=hz.getMap(“aaa”);
HMapKey=新的HMapKey();
key.keyCode=“code1”;
key.time=123;
HMapKey key2=新的HMapKey();
key2.keyCode=“代码2”;
键2.time=246;
地图放置(图例1);
地图放置(键2,2);
int value=map.get(键);
资产质量(价值1);
}
如果要基于整个键值检索值,HMapKey需要实现
Comparable

然后您可以这样查询:


map.values(谓词.equal(“_键”,yourHKMapKeyInstance))

Hazelcast不会反序列化键/值并执行
equals
hashCode
方法,而是通过相应的ByTestStream比较序列化对象。如果您正在搜索一个或多个属性,请查看Tom的答案

Hazelcast不会反序列化键/值,并执行
equals
hashCode
方法,而是通过相应的ByTestStream比较序列化对象。如果您正在搜索一个或多个属性,请查看Tom的答案

您可以通过将变量
time
声明为
transient
来实现这一点。但请注意,它会导致碰撞并给出随机结果。put操作将覆盖上一个值,即使其属性不同

HazelcastInstance instance = Hazelcast.newHazelcastInstance();
IMap<HMapKey, String> testMap = instance.getMap("TEST_MAP");

testMap.put(new HMapKey("code1",123), "This is Code 1");

System.out.println("HMapKey with time=0: " + testMap.get(new HMapKey("code1",0)));
System.out.println("HMapKey with time=123: " + testMap.get(new HMapKey("code1",123)));


testMap.put(new HMapKey("code1",456), "This is Code 2");
System.out.println("HMapKey with time=123: " + testMap.get(new HMapKey("code1",123)));

您可以通过将变量
time
声明为
transient
来实现这一点。但请注意,它会导致碰撞并给出随机结果。put操作将覆盖上一个值,即使其属性不同

HazelcastInstance instance = Hazelcast.newHazelcastInstance();
IMap<HMapKey, String> testMap = instance.getMap("TEST_MAP");

testMap.put(new HMapKey("code1",123), "This is Code 1");

System.out.println("HMapKey with time=0: " + testMap.get(new HMapKey("code1",0)));
System.out.println("HMapKey with time=123: " + testMap.get(new HMapKey("code1",123)));


testMap.put(new HMapKey("code1",456), "This is Code 2");
System.out.println("HMapKey with time=123: " + testMap.get(new HMapKey("code1",123)));

您还可以将代码发布到您尝试从映射中检索的位置吗?更新了我的问题。您还可以将代码发布到您尝试从映射中检索的位置吗?更新了我的问题。如果我想使用类中的单个元素来验证键对象,而不是您提到的bytestream,有什么方法吗?我尝试了Tom的答案,但未能实现。您不能验证,只能查询并查看结果是否符合您的预期。如果我想使用类中的单个元素来验证关键对象,就像您提到的ByTestStream一样,有什么方法吗?我尝试了Tom的答案,但未能实现。您无法验证,只能查询并查看结果是否符合您的预期。谢谢。。它对我有用。但这是唯一的办法吗?因为我想在集群上使用
time
变量。但这不应该是验证密钥的一部分,我相信是的。您也许可以浏览序列化主题以检查它如何转换密钥。如果要使用
time
变量,最好将其包含在hashcode/equals实现中。谢谢。。它对我有用。但这是唯一的办法吗?因为我想在集群上使用
time
变量。但这不应该是验证密钥的一部分,我相信是的。您也许可以浏览序列化主题以检查它如何转换密钥。如果要使用
time
变量,最好将其包含在hashcode/equals实现中。@tom,即使实现
Comparable
@tom,它也不起作用,即使实现
Comparable