Java 自定义对象中的Hazelcast查询

Java 自定义对象中的Hazelcast查询,java,sql,hazelcast,Java,Sql,Hazelcast,我在应用程序中使用Hazelcast作为共享地图。我的地图是这样的: Map 和MyObject: 类MyObject实现可序列化{ //映射字段名->字段值 地图我的地图; } 所以我想使用支持来查询我的对象。我已经检查过Hazelcast是否使用get的方法来检索对象值,但在我的情况下,我没有get,而是希望实现我自己的getField类似: 对象获取字段(字符串字段名){ 返回myMap[fieldName]; } 并强制Hazelcast调用此方法。作为一种解决方法,我已经破解了H

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

Map
MyObject

类MyObject实现可序列化{
//映射字段名->字段值
地图我的地图;
}
所以我想使用支持来查询我的对象。我已经检查过Hazelcast是否使用get的方法来检索对象值,但在我的情况下,我没有get,而是希望实现我自己的
getField
类似:

对象获取字段(字符串字段名){
返回myMap[fieldName];
}
并强制Hazelcast调用此方法。作为一种解决方法,我已经破解了Hazelcast代码,以便在类中使用CustomGetter

/hazelcast/src/main/java/com/hazelcast/query/impl/ReflectionHelper.java
第144行:

if(localGetter==null){
localGetter=新的CustomFieldGetter(名称,obj);
}
这里是我的
CustomFieldGetter
课程:

静态类CustomFieldGetter扩展了Getter{
最终目标值;
最后的班级类型;
最终字符串字段名;
CustomFieldGetter(String fieldName,Object obj)抛出NoSuchMethodException、InvocationTargetException、IllegaAccessException{
超级(空);
this.fieldName=字段名;
this.value=obj.getClass().getMethod(“getField”,String.class).invoke(obj,fieldName);
this.type=value.getClass();
}
@凌驾
对象getValue(对象obj)引发异常{
返回值;
}
@凌驾
类getReturnType(){
返回类型;
}
@凌驾
布尔值可缓存(){
返回false;
}
@凌驾
公共字符串toString(){
返回“FieldGetter[parent=“+parent+”,field=“+fieldName+”];
}
}
好的,很酷,在重新编译Hazelcast之后,使用这个新的jar,我可以使用普通sql访问查询。但对于分页查询,我有一些错误

所以我的最后一个问题是: 我希望避免hack Hazelcast代码(用于进一步更新)。Hazelcast在这个问题上是否有一些支持?这个问题还有别的解决办法吗

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


提前感谢。

一个选项是实现接口。然后您可以将每个条目作为单独的字段写入。这假设条目值也实现了可移植接口


看看如何使用便携设备

与其将此发布到Stackoverflow,不如使用补丁创建pullrequest或在bugtracker中创建功能请求。我们不在网上搜索请求,github上没有的问题不作为请求存在:)事实上,我不确定添加这样的内容是否有意义,如果你开始这样做,每个人都有不同的方式,就像类加载一样。getter/setter是由bean规范定义的,如果您不使用它们,很可能没有框架支持您的方式。PS:为什么PP会出问题,不知道:)谢谢你的建议。我也在Hazelcast ML中分享了这个链接。问题是,我们不能创建getter和setter,因为这些类是根据需要实时创建的(这里不选择重载jvm)。我不能创建一个拉请求,因为它对我的问题太特殊了,它只是一个缓和的解决方案,直到我们得到最好的方法。无论如何,我很感激。我想是的。它将使用Portable中的字段,而不是使用反射来调用getter。我相信它将解决这个问题。现在就实施它。很快让你知道。哦,对了,因为它支持部分反序列化,所以实现方式不同:)听到这个消息太好了!