2012-11-14 2 views
0

Google 앱 엔진의 데이터 스토어에서 값을 가져 오는 코드는 다음과 같습니다.Quering 데이터 스토어에서 알 수없는 오류가 발생했습니다.

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(); 

아래가 스택 추적입니다. 이것은 언젠가 작동합니다. 하지만 지금은 효과가 없습니다. Google 애플리케이션 엔진 및 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 

이며, 또한 내가 쿼리 '에 의해 순서'가 '시간'열에서 같은 값이 때 나는별로 주문하려고에서만 발생하는 오류를 발견 . 예를 들어 데이터 저장소에서 '시간'열의 값이 955 인 두 개의 행이 있습니다. 그런 다음 주문 순서를 수행 할 수 없습니다. 955, 966과 같은 주문 쿼리가 작동하는 경우 희망 나는 이것을 분명히했다 :). 이것은 버그 또는 뭔가인가요? 게임에 전달하는 값이 "실행 됨"

+0

'LeaderBoard' 클래스의 정의를 추가 할 수 있습니까? 또한 '게임'의 가치는 무엇입니까? –

+0

질문을 편집했습니다. – user1774252

답변

0

메모리 내 쿼리를 사용하도록 설정 했으므로 데이터 저장소의 모든 쿼리와 메모리 내 평가자의 기능을 평가할 수 없습니다 using은 해당 쿼리를 처리하지 않습니다. GAE JDO 플러그인 v2.0.x를 사용했을 것입니다. 실제로 사용 된 소프트웨어 버전을 인용하는 것이 좋습니다.

보다 완벽한 메모리 내 쿼리 기능을 갖춘 GAE JDO 플러그인 (DataNucleus 3.1.x 포함)의 v2.1.1을 사용하십시오.

+0

메모리에서 쿼리를 사용할 수 없습니다. 나는 그 일을하는 법을 모른다. 또한 gae 용 api 패키지를 변경하는 방법? – user1774252

+0

Ahh, ok, 사용자가 no라고 쓰지 않는 한 datastore에서 평가할 수없는 것을 발견하면 메모리 내 기본값으로 설정됩니다. 현재 GAE SDK (1.7.3?)에는 v2.1.x의 JDO 플러그인이 있습니다. 아마도 SDK를 업그레이드할까요? – DataNucleus

+0

괜찮습니다. 업그레이드를 시도합니다. 진행 상황을 알려줍니다. 그러나 이것이 당신이 생각하는 버그는 아닙니다. 제 편집 된 질문을 참조하십시오 – user1774252

0

문제가 해결되었습니다. 문제는 'scoredDate'가있는 엔티티에 있었고 'createdDate'로 주문하려고합니다. 학교 소년 문제 :). 그러나 GAE는 적절한 예외를주지 않습니다. 매우 나쁨

+0

오류 메시지에 대해 불평하기 쉬운 것은 * 당신 *이 잘못한 것을 말하지 않지만, 사용자가 잘못 할 수있는 많은 것들이 있으며, 모든 것을 탐지하는 것이 비실용적입니다. 당연히 당신은 그 상황을 증명하고 http://ogo.us/p/datanucleus-appengine/ – DataNucleus

+0

에 Googles 이슈 트래커에서 문제를 제기하는 테스트 케이스를 쉽게 생성 할 수 있습니다. 프로그래머로서 나는 그것을 이해합니다. – user1774252