Java 在Gemfire 6.5区域的OQL查询中调用对象上的方法

Java 在Gemfire 6.5区域的OQL查询中调用对象上的方法,java,methods,gemfire,oql,Java,Methods,Gemfire,Oql,我使用下面的Java 6代码查询Gemfire 6.5缓存 我的问题是,我正在尝试使用WHERE从区域中的对象中使用方法调用来过滤我的结果,但出于某种原因,它抱怨java.lang.String不包含我在讨论MyEntity时尝试使用的方法,因为该类是缓存中的对象 我最好的猜测是,dersialization有一点很有趣,类作为字符串类出现,此时它不包含该方法,然后用该方法转换为MyEntity类,并且代码试图在转换该类之前从MyEntity调用该方法 package gemfire.run;

我使用下面的Java 6代码查询Gemfire 6.5缓存

我的问题是,我正在尝试使用WHERE从区域中的对象中使用方法调用来过滤我的结果,但出于某种原因,它抱怨java.lang.String不包含我在讨论MyEntity时尝试使用的方法,因为该类是缓存中的对象

我最好的猜测是,dersialization有一点很有趣,类作为字符串类出现,此时它不包含该方法,然后用该方法转换为MyEntity类,并且代码试图在转换该类之前从MyEntity调用该方法

package gemfire.run;

import com.gemstone.gemfire.DataSerializable;
import com.gemstone.gemfire.Instantiator;
import com.gemstone.gemfire.cache.client.ClientCache;
import com.gemstone.gemfire.cache.client.ClientCacheFactory;
import com.gemstone.gemfire.cache.query.Query;
import com.gemstone.gemfire.cache.query.QueryService;
import com.gemstone.gemfire.cache.query.SelectResults;

import entity.MyEntity;

public class QueryServerCache {
@SuppressWarnings({ "unchecked", "unused" })
public static void main(String[] args) {

    System.out.println("Start Program");

    Instantiator.register(new Instantiator(MyEntity.class, 60151) {
        @Override
        public DataSerializable newInstance() {
            return new MyEntity();
        }
    });

    ClientCache clientCache = new ClientCacheFactory().addPoolServer("myServer.net", 12345).set("log-level", "error").create();

    QueryService queryService = clientCache.getQueryService();

    Query q1 = queryService.newQuery("SELECT DISTINCT * FROM /rootregion/traderegion o WHERE o.getEventId = 'X123'");
    Query q = queryService.newQuery("SELECT * FROM /rootregion/traderegion LIMIT 10");
    try {
        SelectResults<MyEntity> results = (SelectResults<MyEntity>) q1.execute();
        System.out.println("\n" + results.size() + "\n");
        for (MyEntity o : results) {
            System.out.println(o.getEventId());
        }

    } catch (Exception e) {
        e.printStackTrace();
    }

    System.out.println("\nExit Program");

}
}
使用查询q而不是q1运行它效果很好,因此它似乎能够访问MyEntity进行反序列化,但是如果我尝试以下操作:

Query q1 = queryService.newQuery("SELECT DISTINCT * FROM /rootregion/traderegion o WHERE (MyEntity)o.getEventId = 'X123'");

我在不知道MyEntity是什么的情况下得到了一个错误。

结果是,在该区域中使用了一个heartbeat,空字符串对象,我只需过滤结果将其删除,然后再使用MyEntity特定的方法和变量进行过滤

Query q = queryService.newQuery("SELECT * FROM (SELECT * FROM /rootregion/traderegion WHERE toString()!='') WHERE eventId='X123'");
这过滤掉了空对象,只剩下MyEntity对象供进一步处理

Query q = queryService.newQuery("SELECT * FROM (SELECT * FROM /rootregion/traderegion WHERE toString()!='') WHERE eventId='X123'");