Hazelcast:添加索引时出现问题

时间:2016-03-15 07:38:53

标签: 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)

我理解它正试图在值类

中找到index属性

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

1 个答案:

答案 0 :(得分:1)

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

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;
    }
}

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