2012-11-14 27 views
0

我有以下代碼可以從Google應用引擎中的數據存儲中獲取值。查詢數據存儲時Google應用引擎中的未知錯誤

PersistenceManager pm = JDOUtil.get().getPersistenceManager(); 
Extent extent = pm.getExtent(LeaderBoard.class, true); 

Query q = pm.newQuery(extent); 
q.setFilter("game =='"+game+"'"); 
q.setOrdering("time DESC,createdDate DESC"); 

List<LeaderBoard> leaderBoard = (List<LeaderBoard>) q.execute(); 
pm.close(); 

但是,當我嘗試它給我一個奇怪的錯誤,我不熟悉低於線。

List<LeaderBoard> leaderBoard = (List<LeaderBoard>) q.execute(); 

下面是堆棧跟蹤。這有效。但它現在不工作。 我正在使用谷歌應用程序引擎和jdo。

ERROR :java.lang.ClassCastException: org.datanucleus.query.evaluator.memory.InMemoryFailure cannot be cast to java.lang.Comparable 
stackTrace :java.lang.ClassCastException: org.datanucleus.query.evaluator.memory.InMemoryFailure cannot be cast to java.lang.Comparable 
    at org.datanucleus.query.QueryUtils$3.compare(QueryUtils.java:1317) 
    at java.util.Arrays.mergeSort(Arrays.java:1446) 
    at java.util.Arrays.legacyMergeSort(Arrays.java:1356) 
    at java.util.Arrays.sort(Arrays.java:1345) 
    at org.datanucleus.query.QueryUtils.orderCandidates(QueryUtils.java:1288) 
    at org.datanucleus.query.evaluator.JavaQueryEvaluator.ordering(JavaQueryEvaluator.java:471) 
    at org.datanucleus.query.evaluator.JavaQueryEvaluator.execute(JavaQueryEvaluator.java:220) 
    at com.google.appengine.datanucleus.query.JDOQLQuery.performExecute(JDOQLQuery.java:153) 
    at org.datanucleus.store.query.Query.executeQuery(Query.java:1789) 
    at org.datanucleus.store.query.Query.executeWithArray(Query.java:1666) 
    at org.datanucleus.store.query.Query.execute(Query.java:1639) 
    at org.datanucleus.api.jdo.JDOQuery.execute(JDOQuery.java:221) 
    at com.googlecreativelab.dao.LeaderBoardDAO.isTopScore(LeaderBoardDAO.java:68) 
    at com.googlecreativelab.dao.LeaderBoardDAO.saveTopScore(LeaderBoardDAO.java:26) 
    at com.googlecreativelab.service.GameDataService.processRequest(GameDataService.java:188) 
    at com.googlecreativelab.service.GameDataService.doGet(GameDataService.java:290) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166) 
    at com.google.apphosting.utils.servlet.ParseBlobUploadFilter.doFilter(ParseBlobUploadFilter.java:102) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.apphosting.runtime.jetty.SaveSessionFilter.doFilter(SaveSessionFilter.java:35) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) 
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418) 
    at com.google.apphosting.runtime.jetty.AppVersionHandlerMap.handle(AppVersionHandlerMap.java:266) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:326) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923) 
    at com.google.apphosting.runtime.jetty.RpcRequestParser.parseAvailable(RpcRequestParser.java:76) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) 
    at com.google.apphosting.runtime.jetty.JettyServletEngineAdapter.serviceRequest(JettyServletEngineAdapter.java:146) 
    at com.google.apphosting.runtime.JavaRuntime$RequestRunnable.run(JavaRuntime.java:447) 
    at com.google.tracing.TraceContext$TraceContextRunnable.runInContext(TraceContext.java:454) 
    at com.google.tracing.TraceContext$TraceContextRunnable$1.run(TraceContext.java:461) 
    at com.google.tracing.TraceContext.runInContext(TraceContext.java:703) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContextNoUnref(TraceContext.java:338) 
    at com.google.tracing.TraceContext$AbstractTraceContextCallback.runInInheritedContext(TraceContext.java:330) 
    at com.google.tracing.TraceContext$TraceContextRunnable.run(TraceContext.java:458) 
    at com.google.apphosting.runtime.ThreadGroupPool$PoolEntry.run(ThreadGroupPool.java:251) 
    at java.lang.Thread.run(Thread.java:679) 

以下是排行榜類

@PersistenceCapable 
public class LeaderBoard implements Serializable { 

    private static final long serialVersionUID = 3671283388721366564L; 
    @PrimaryKey 
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) 
    private Key key; 
    @Persistent 
    private String name; 
    @Persistent 
    private Integer avatar; 
    @Persistent 
    private String game; 
    @Persistent 
    private Integer time; 
    @Persistent 
    private Date scoredDate; 

    //Setter and getters 

而且我也發現錯誤到來時,纔會有在「時間」列相同的值,我試圖通過對它們進行排序「命令通過」查詢。 例如在數據存儲中,我有兩行,'time'列有955個值。然後我不能按順序做,如果它的955,966類似於這個訂單查詢的工作。希望我明確表示:)。 這是一個錯誤什麼的。我傳遞給遊戲的價值是「運行」

+0

你可以添加你的'LeaderBoard'類的定義嗎?此外,您添加到過濾器的「遊戲」的價值是什麼? –

+0

我編輯了問題 – user1774252

回答

0

因此,您啓用了查詢內存,並且它無法評估數據存儲中的所有查詢以及您在內存中的評估程序的功能使用不符合該查詢。 推測使用GAE JDO插件的v2.0.x(實際上會引用所用軟件的版本)。

使用GAE JDO插件(具有DataNucleus 3.1.x)的v2.1.1具有更完整的內存查詢功能。

+0

我還沒有啓用在內存中查詢。我不知道該怎麼做。還有如何更改gae的api包? – user1774252

+0

呵呵,好吧,忘記它默認情況下內存時,它發現一些不可評估的數據存儲區,除非用戶說不。目前的GAE SDK(1.7.3?)有JDO插件的v2.1.x--也許升級了SDK? – DataNucleus

+0

好吧,我會嘗試升級。會讓你知道進展。但是你不認爲這是一個錯誤。請參閱我編輯的問題 – user1774252

0

修復了這個問題:),問題出在實體上我有'scoredDate',我試圖按'createdDate'命令。學校男孩問題:)。但GAE仍然沒有給出適當的例外。非常差

+0

它很容易抱怨錯誤消息不告訴你你做錯了什麼,但是然後有很多事情用戶可以做錯,而且它通常不可能檢測到所有錯誤。很明顯,你可以很容易地生成一個測試用例來證明這種情況,並在http://code.google.com/p/datanucleus-appengine/ – DataNucleus

+0

上提出Google問題跟蹤問題。作爲一名程序員,我明白這一點。 – user1774252

相關問題