Запрос Hazelcast в пользовательских объектах

Я использую Hazelcast в качестве общей карты в своем приложении. Моя карта такая:

Map<String, MyObject>

и MyObject:

class MyObject implements Serializeble {
    // Map FieldName -> FieldValue
    Map<String, Object> myMap;
}

поэтому я хотел бы использовать распределенный запрос Hazelcast поддержка запроса в моем объекте. Я проверил, что Hazelcast использует метод get для извлечения значения объекта, но в моем случае у меня нет get, вместо того, чтобы я хотел бы реализовать свой собственный getField как:

Object getField(String fieldName) {
    return myMap[fieldName];
}

и заставить Hazelcast вызвать этот метод. Как обходной путь, я взломал код Hazelcast, чтобы использовать CustomGetter в классе

/hazelcast/src/main/java/com/hazelcast/query/impl/ReflectionHelper.java

строка 144:

if (localGetter == null) {
    localGetter = new CustomFieldGetter(name, obj);
}

а вот мой CustomFieldGetter класс:

static class CustomFieldGetter extends Getter {
    final Object value;
    final Class type;
    final String fieldName;

    CustomFieldGetter(String fieldName, Object obj) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        super(null);
        this.fieldName = fieldName;
        this.value = obj.getClass().getMethod("getField", String.class).invoke(obj, fieldName);
        this.type = value.getClass();
    }

    @Override
    Object getValue(Object obj) throws Exception {
        return value;
    }

    @Override
    Class getReturnType() {
        return type;
    }

    @Override
    boolean isCacheable() {
        return false;
    }

    @Override
    public String toString() {
        return "FieldGetter [parent=" + parent + ", field=" + fieldName + "]";
    }
}

Ok круто, после перекомпиляции Hazelcast и с помощью этой новой банки я мог бы достичь запросов с помощью простого sql. Но для pagingQueries я получил некоторые ошибки.

Итак, я, наконец, вопрос: Я хотел бы избежать взлома кода Hazelcast (для дальнейших обновлений). Имеет ли Hazelcast некоторые поддержки по этому вопросу? Есть ли другое решение этой проблемы?

PS: я использую версию Hazelcast ->hazelcast-3.3-RC3

спасибо заранее.

1 ответов


один из вариантов-реализовать портативный интерфейс. Затем вы можете записать каждую запись в отдельное поле. Это предполагает, что значение записи реализует портативный интерфейс, а также.

посмотреть пример кода Как использовать портативный.