2013-12-09 52 views
0

我正在嘗試將jpa與應用程序引擎數據存儲配合使用。在數據存儲上使用jpa的空結果列表

持久性是好的,雖然我似乎無法得到任何我堅持在數據庫中的對象。

這裏是我做的方法:

公開名單getAllBooks(){

EntityManager em = EMF.get().createEntityManager(); 

    Query query = em.createQuery("select b from Book b"); 

    List<Book> books = (List<Book>) query.getResultList(); 

    em.close(); 

    return books; 

}

奇怪的是,當我調試,看看我的列表結果,有一些東西我不明白:

1 - 我的列表似乎實際上是一個StreamingQueryResult,其大小是-1

2 - 當我在這個StreamingQueryResult中搜索時,我意識到我在我的數據庫中的3本書實際上是在LazyResult中名爲resolvedPojos的數組列表中,但我不知道不知道如何得到它們。

有沒有人有想法?

回答

0

您必須對lazy集合進行顯式調用才能初始化它(通常的做法是爲此調用.size())。

我認爲「this link」解決了這個問題。 「This link」也許也是。

+0

我試圖調用size(),但似乎沒有辦法。 我沒有得到的是,如果只有一個實體要加載,jpa爲什麼會進行延遲加載... – user3083103

0

簡單地通過一些代理「列表」回你的應用程序的其餘部分是(恕我直言)不好的做法;你將自己暴露在List對懶惰加載方面的任何古怪事物上。您關閉EM的事實意味着您無法容忍延遲加載。因此,只需創建您自己的列表並將查詢結果列表複製到它中... 關閉EM之前,同時這樣做,如果想要查詢結果的孩子然後觸摸相關領域(所以他們被加載),或確保它們位於查詢的提取計劃(DataNucleus擴展)中。

相關問題