java - Hazelcast:添加索引时出现问题

标签 java hazelcast

我有一个 hazelcast 实例,其键为 MyObject 类型,值是枚举。 假设 MyObject 类的属性之一是 date,其类型为 java.sql.Date

    class MyObject {
       private Date date;
       public Date getDate() {
         return date;
       }
       public void setDate(Date date) {
         this.date = date
       }
    }

public enum MyEnum {
  TEST_ENUM;
}

我还使用谓词来过滤键并检索枚举值。 例如:

EntryObject entryObject = new PredicateBuilder().getEntryObject();    
PredicateBuiler predicateBuilder = entryObject.key.get(date).isNull;

这就是我尝试添加索引的方式:

IMap<MyObject, MyEnum> map = hazelcastInstance.getMap("test");    
map.addIndex("date", true)

但是一旦执行,就会抛出异常:

com.hazelcast.query.QueryException: java.lang.IllegalArgumentException: There is no suitable accessor for 'date' on class 'class com.main.constants.myEnum'
at com.hazelcast.query.impl.getters.ReflectionHelper.createGetter(ReflectionHelper.java:176)
at com.hazelcast.query.impl.getters.Extractors.instantiateGetter(Extractors.java:88)
at com.hazelcast.query.impl.getters.Extractors.getGetter(Extractors.java:73)
at com.hazelcast.query.impl.getters.Extractors.extract(Extractors.java:57)
at com.hazelcast.query.impl.QueryableEntry.extractAttributeValueFromTargetObject(QueryableEntry.java:156)
at com.hazelcast.query.impl.QueryableEntry.extractAttributeValue(QueryableEntry.java:82)
at com.hazelcast.query.impl.QueryableEntry.getAttributeValue(QueryableEntry.java:48)
at com.hazelcast.query.impl.QueryableEntry.getConverter(QueryableEntry.java:67)
at com.hazelcast.query.impl.IndexImpl.saveEntryIndex(IndexImpl.java:67)
at com.hazelcast.map.impl.operation.AddIndexOperation.run(AddIndexOperation.java:75)

我知道它正在尝试在值类中查找索引属性

我如何让这个东西工作,即在键上而不是在值上添加索引。

最佳答案

在编写测试时,我实际上发现了你的问题:-)

import com.hazelcast.core.Hazelcast;
import com.hazelcast.core.HazelcastInstance;
import com.hazelcast.core.IMap;
import com.hazelcast.query.EntryObject;
import com.hazelcast.query.PredicateBuilder;

import java.io.Serializable;
import java.sql.Date;

public class Test
{
    public static void main(String[] args)
    {
        HazelcastInstance hz = Hazelcast.newHazelcastInstance();

        IMap<MyObject, MyEnum> map = hz.getMap("test");

        EntryObject entryObject = new PredicateBuilder().getEntryObject();
        PredicateBuilder builder = entryObject.key().get("date").isNull();

        map.addIndex("__key#date", true);

        map.put(new MyObject(), MyEnum.TEST_ENUM);
    }

    public static class MyObject implements Serializable
    {
        private Date date;

        public Date getDate()
        {
            return date;
        }

        public void setDate(Date date)
        {
            this.date = date;
        }
    }

    public static enum MyEnum {
        TEST_ENUM;
    }
}

诀窍是根据映射键而不是默认采用的值创建索引。您已经在查询 entryObject.key() 中执行了此操作,但在索引定义 __key.date 中错过了它。

关于java - Hazelcast:添加索引时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36005130/

相关文章:

java - Hazelcast:分布式执行和本地成员信息

Hazelcast 可移植序列化

java - 在 Hazelcast 中使用快速聚合时无法创建自定义谓词

Java:ArrayList add() 和 remove() 性能、实现?

java - 通用双向一对多关系

Java 变量可见性

java - com.hazelcast.config.MaxSizeConfig 的导入问题

Java 到 Json 保留引用

java - 通过双击 Rhapsody 中的输出行打开源文件

redis - Zookeeper vs 内存数据网格 vs Redis