Запрос 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 ответов
один из вариантов-реализовать портативный интерфейс. Затем вы можете записать каждую запись в отдельное поле. Это предполагает, что значение записи реализует портативный интерфейс, а также.
посмотреть пример кода Как использовать портативный.