2016-03-15 2 views
0

У меня есть экземпляр hazelcast, ключ которого имеет тип MyObject, а значение - перечисление. Скажем, одним из атрибутов класса MyObject является date, который имеет тип java.sql.Date.Hazelcast: Проблема при добавлении индекса

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

public enum MyEnum { 
    TEST_ENUM; 
} 

Также я использую предикат для фильтрации по ключам, чтобы получить значение перечисления. Для Ex:

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) 

Я понимаю он пытается найти атрибут индекса в классе значений

Как мне выбрать g и эта работа, т. е. добавляет индекс к ключу, а не к значению.

+0

Какая версия Hazelcast? – noctarius

+0

Я полагаю, вы добавляете поле 'date' в класс' MyEnum'. Вы пытаетесь это сделать? И, Hazelcast требует метода getter для поля 'date' в классе. –

+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 », однако индексирование поддерживает только ключевое слово, поскольку вы не можете передать определение Predicate. – noctarius

+0

wow. никогда не знал этого. Спасибо @noctarius за то, что уделили вам время и посмотрели на это. Я попробую это сейчас и дам вам знать. –

Смежные вопросы