自定义对象中的Hazelcast查询

Ser*_*ago 6 java sql hazelcast

我在我的应用程序中使用Hazelcast作为共享地图.我的地图是这样的:

Map<String, MyObject>
Run Code Online (Sandbox Code Playgroud)

并且MyObject:

class MyObject implements Serializeble {
    // Map FieldName -> FieldValue
    Map<String, Object> myMap;
}
Run Code Online (Sandbox Code Playgroud)

所以我想使用Hazelcast分布式查询支持在我的对象中查询.我已经检查过Hazelcast使用get的方法来检索对象值,但在我的情况下我没有得到,而不是我想实现我自己的getField:

Object getField(String fieldName) {
    return myMap[fieldName];
}
Run Code Online (Sandbox Code Playgroud)

并强制Hazelcast称这种方法.作为一种解决方法,我已经破解了Hazelcast代码,以便在课堂上使用CustomGetter

/hazelcast/src/main/java/com/hazelcast/query/impl/ReflectionHelper.java
Run Code Online (Sandbox Code Playgroud)

第144行:

if (localGetter == null) {
    localGetter = new CustomFieldGetter(name, obj);
}
Run Code Online (Sandbox Code Playgroud)

在这里我的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 + "]";
    }
}
Run Code Online (Sandbox Code Playgroud)

好的很酷,在重新编译Hazelcast之后,使用这个新的jar,我可以使用普通的sql来查询.但对于pagingQueries,我遇到了一些错误.

所以我最后的问题是:我想避免破解Hazelcast代码(进一步更新).Hazelcast在这个问题上有一些支持吗?这个问题还有其他解决办法吗?

PS:我正在使用Hazelcast版本 - > hazelcast-3.3-RC3

提前致谢.

Jar*_*ala 3

一种选择是实现便携式接口。然后您可以将每个条目编写为单独的字段。这假设条目值也实现了 Portable 接口。

示例代码如何使用Portable。