Google App Engine平台下JDOQL查询报异常的问题解决方案
?
在java應用程序開發(fā)中使用JDO數(shù)據(jù)存儲的方式,里面涉及到以對象為基礎建立永久性數(shù)據(jù)。看不到數(shù)據(jù)庫文件也看不到表,只有自定義的實體類,存儲的方式也很簡單,定義一個實體類,然后將其屬性賦值,然后調用PersistenceManager 類提供的方法存儲這個對象即可。但是在數(shù)據(jù)的查詢過程中卻是傷透腦筋。以下是我近幾天遇到的問題和自己琢磨的解決方案,其中Baby是我定義的實體類。
1.執(zhí)行GetObjectById()拋出異?!?Could not retrieve entity of kind Baby with key Baby("31~60")”其中Baby是我定義的實體類,30~61是我傳遞的一個作為Id的參數(shù)。一直以為哪里的代碼出現(xiàn)問題了或者參數(shù)的格式不對等問題,經(jīng)反復試驗才知道。這就是GetObjectById()這個方法本身的問題。不像SQL中傳入個Id查詢有則返回這個對象,沒有則返回空,JDO中的數(shù)據(jù)查詢是傳入的Id必須能查到數(shù)據(jù),若沒有就拋出上述異常。
?
解決方案:將GetObjectById()方法用try/catch括起來,形如:
這樣,有這個數(shù)據(jù)返回該記錄沒有則返回null
2.執(zhí)行newQuery()拋出類型轉換錯誤
具體英文我忘了,意思就是說意思就是說無法將Baby集合轉換成Baby類型,也就是List<Baby>無法轉換成Baby類型。在SQL中可能根據(jù)一條查詢語句”select * from Baby where Id=’31~60’”調用方法返回的可以轉換成Baby對象,可是JDO中調用newQuery()不管傳入的查詢語句參數(shù)是什么,都會返回一個List<Object>類型。
解決方案:調用newQuery()就將其結果賦值一個List<Object>的變量吧。
3. 執(zhí)行newQuery()方法拋出” Object Manager has been closed”的異常
這是位于DataServer類中的查詢方法代碼:
我在另一處調用
結果一運行就拋那個異常了。原因就是GetBabyInfoList方法中的pm.close();,將這句去掉就OK了,了解JDO的人士可能會說將實體類定義成可分離的再在代碼中加句pm.setDetachAllOnCommit(true);。事實無情的告訴你,不行!
解決方案:去掉方法中在返回對象前的pm.close();語句。
轉載于:https://www.cnblogs.com/wencansz/archive/2012/11/12/2766802.html
總結
以上是生活随笔為你收集整理的Google App Engine平台下JDOQL查询报异常的问题解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Hit or Miss
- 下一篇: 对于58同城自动登陆的补充【主要是代码】