2014-08-29 91 views
6

我在我的应用程序中使用Hazelcast作为共享地图。我的地图是这样的:自定义对象中的Hazelcast查询

Map<String, MyObject> 

MyObject

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

所以我想使用Hazelcast distributed query支持我的对象查询。我检查了Hazelcast使用获得的方法来检索对象的值,但对我来说,我没有一个get,而不是我想实现我自己的getField像:

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

,并迫使Hazelcast调用这个方法。作为一种变通方法,我砍死Hazelcast代码中的类

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

线使用CustomGetter 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 + "]"; 
    } 
} 

好凉,在重新编译Hazelcast之后,使用这个新的jar,我可以使用普通的sql来查询。但对于pagingQueries,我有一些错误。

所以我最后的问题是: 我想避免黑客Hazelcast代码(进一步更新)。 Hazelcast在这个问题上有一些支持吗?有没有其他解决方案来解决这个问题?

PS:我使用Hazelcast版本 - >hazelcast-3.3-RC3提前

感谢。

+5

而不是发布到Stackoverflow这将是更有意义的创建一个pullrequest的补丁或在bugtracker中创建一个功能请求。我们不在网上搜索请求,什么不在github作为一个问题不存在作为一个请求:) 其实我不知道是否有意义添加类似的东西,如果你开始这个每个人来以不同的方式,类加载。 getters/setters是由bean规范定义的,如果你没有使用它们,那么很可能没有框架支持你的方式。 PS:为什么PP会造成问题,不知道:) – noctarius 2014-09-02 04:23:21

+0

感谢您的建议。我也在Hazelcast ML中分享了这个链接。问题是,我们无法创建getter和setter,因为这些类是根据需要实时创建的(重新加载jvm不是此处的选项)。我无法创建拉请求,因为它对我的问题太过分了,在我们得到最佳方法之前,这只是一个姑息性解决方案。 无论如何,我很感激。 – Santiago 2014-09-02 13:24:18

回答

3

一个选项是实现Portable接口。然后你可以把每个条目写成一个单独的字段。这假设输入值也实现了Portable接口。

看看sample code如何使用Portable。

+0

它不能解决查询问题,是吗? – noctarius 2014-09-03 04:18:36

+1

我认为它的确如此。它将使用Portable的字段而不是使用反射来调用getter。 – 2014-09-03 14:28:42

+0

我相信它会解决问题。现在就实施它。让你尽快知道。 – Santiago 2014-09-03 15:58:21