2016-03-15 47 views
0

我有一个hazelcast实例,其密钥类型为MyObject,值为enum。 假设MyObject类的其中一个属性为date,其类型为java.sql.DateHazelcast:添加索引时发布

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) 

我明白它试图找到值类中的索引属性

我该如何克服等这个东西工作,即添加索引的关键,而不是价值。

+0

什么版本的Hazelcast? – noctarius

+0

我想,你将'date'字段添加到'MyEnum'类中。你想这样做吗?而且,Hazelcast需要类中的'date'字段的getter方法。 –

+0

@noctarius:榛色版本是3.6 –

回答

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

关键是要创建一个基于地图的关键,而不是它采取的是默认值的索引中。您已在查询entryObject.key()中完成,但在索引定义__key.date上错过了它。

+0

我应该尝试一下。只是澄清一下:我必须以“__key”为前缀。添加索引时的日期属性? –

+1

是的,你必须。 '__key'关键字提供与'EntryObject :: key'相同的访问权限,但是索引只支持关键字,因为你不能传入谓词定义。 – noctarius

+0

哇。从来不知道这个。感谢@noctarius让你的时间和看着这个。我现在就试试看,并让你知道。 –