2016-03-15 46 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讓你的時間和看着這個。我現在就試試看,並讓你知道。 –