2015-02-02 3 views
0

Я использую приведенный ниже код Java 6 для запроса кеша Gemfire 6.5.Вызов метода для объекта в OQL-запросе на Gemfire 6.5 Region

Моя проблема заключается в том, что я пытаюсь отфильтровать мои результаты с помощью WHERE, используя вызов метода из объектов в регионе, но по какой-то причине он жалуется на java.lang.String, не содержащий метода, который я пытаюсь использовать, когда он должен говорить о MyEntity, так как именно этот класс является объектом в кеше.

Мое лучшее предположение, что есть что-то смешное с dersialization и что класс входит в класс String, в этот момент он не содержит этот метод, а затем преобразован в класс 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"); 

} 
} 

трассировку стека для кода:

Start Program 
com.gemstone.gemfire.cache.client.ServerOperationException: While performing a remote query 
at com.gemstone.gemfire.cache.client.internal.AbstractOp.processChunkedResponse(AbstractOp.java:323) 
at com.gemstone.gemfire.cache.client.internal.QueryOp$QueryOpImpl.processResponse(QueryOp.java:145) 
at com.gemstone.gemfire.cache.client.internal.AbstractOp.attemptReadResponse(AbstractOp.java:150) 
at com.gemstone.gemfire.cache.client.internal.AbstractOp.attempt(AbstractOp.java:363) 
at com.gemstone.gemfire.cache.client.internal.ConnectionImpl.execute(ConnectionImpl.java:245) 
at com.gemstone.gemfire.cache.client.internal.pooling.PooledConnection.execute(PooledConnection.java:321) 
at com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.executeWithPossibleReAuthentication(OpExecutorImpl.java:646) 
at com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:108) 
at com.gemstone.gemfire.cache.client.internal.OpExecutorImpl.execute(OpExecutorImpl.java:84) 
at com.gemstone.gemfire.cache.client.internal.PoolImpl.execute(PoolImpl.java:610) 
at com.gemstone.gemfire.cache.client.internal.QueryOp.execute(QueryOp.java:47) 
at com.gemstone.gemfire.cache.client.internal.ServerProxy.query(ServerProxy.java:80) 
at com.gemstone.gemfire.cache.query.internal.DefaultQuery.executeOnServer(DefaultQuery.java:248) 
at com.gemstone.gemfire.cache.query.internal.DefaultQuery.execute(DefaultQuery.java:135) 
at com.gemstone.gemfire.cache.query.internal.DefaultQuery.execute(DefaultQuery.java:117) 
at gemfire.run.QueryServerCache.main(QueryServerCache.java:33) 
Caused by: com.gemstone.gemfire.cache.query.NameNotFoundException: No public attribute named ' getEventId ' was found in class java.lang.String 
at com.gemstone.gemfire.cache.query.internal.AttributeDescriptor.getReadMember(AttributeDescriptor.java:184) 
at com.gemstone.gemfire.cache.query.internal.AttributeDescriptor.read(AttributeDescriptor.java:70) 
at com.gemstone.gemfire.cache.query.internal.AttributeDescriptor.read(AttributeDescriptor.java:56) 
at com.gemstone.gemfire.cache.query.internal.PathUtils.evaluateAttribute(PathUtils.java:63) 
at com.gemstone.gemfire.cache.query.internal.CompiledPath.evaluate(CompiledPath.java:127) 
at com.gemstone.gemfire.cache.query.internal.CompiledComparison.evaluate(CompiledComparison.java:72) 
at com.gemstone.gemfire.cache.query.internal.CompiledSelect.doNestedIterations(CompiledSelect.java:449) 
at com.gemstone.gemfire.cache.query.internal.CompiledSelect.doNestedIterations(CompiledSelect.java:490) 
at com.gemstone.gemfire.cache.query.internal.CompiledSelect.doIterationEvaluate(CompiledSelect.java:376) 
at com.gemstone.gemfire.cache.query.internal.CompiledSelect.evaluate(CompiledSelect.java:304) 
at com.gemstone.gemfire.cache.query.internal.DefaultQuery.executeUsingContext(DefaultQuery.java:382) 
at com.gemstone.gemfire.cache.query.internal.DefaultQuery.execute(DefaultQuery.java:181) 
at com.gemstone.gemfire.cache.query.internal.DefaultQuery.execute(DefaultQuery.java:117) 
at com.gemstone.gemfire.internal.cache.tier.sockets.BaseCommand.processQueryUsingParams(BaseCommand.java:1216) 
at com.gemstone.gemfire.internal.cache.tier.sockets.BaseCommand.processQuery(BaseCommand.java:1167) 
at com.gemstone.gemfire.internal.cache.tier.sockets.command.Query.cmdExecute(Query.java:76) 
at com.gemstone.gemfire.internal.cache.tier.sockets.BaseCommand.execute(BaseCommand.java:133) 
at com.gemstone.gemfire.internal.cache.tier.sockets.ServerConnection.doNormalMsg(ServerConnection.java:758) 
at com.gemstone.gemfire.internal.cache.tier.sockets.ServerConnection.doOneMessage(ServerConnection.java:879) 
at com.gemstone.gemfire.internal.cache.tier.sockets.ServerConnection.run(ServerConnection.java:1067) 
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
at com.gemstone.gemfire.internal.cache.tier.sockets.AcceptorImpl$1$1.run(AcceptorImpl.java:504) 
at java.lang.Thread.run(Thread.java:662) 

Exit Program 

Запуск его с помощью запроса д, а не q1 работает нормально, так что, похоже, чтобы иметь возможность получить доступ к MyEntity для десериализации Однако если я пытаюсь что-то например:

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

Я получаю сообщение об ошибке, не зная, что такое MyEntity.

ответ

0

Итак, выяснилось, что в этом регионе было задействовано сердцебиение, пустой объект строки, и мне просто пришлось отфильтровать результаты, чтобы удалить его, прежде чем я затем буду фильтроваться с помощью специальных методов и переменных MyEntity.

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

Это отфильтрованы пустые объекты и оставили меня только объекты MyEntity для дальнейшей обработки