2012-01-09 63 views
7

我正在使用JPA2及其Criteria API從數據庫中選擇我的實體。實現是WebSphere Application Server上的OpenJPA。我所有的實體都使用Fetchtype = Lazy建模。jpa使用標準api在多個級別上實現惰性獲取實體

我從數據庫中選擇一些符合條件的實體,並希望一次加載子表中的所有嵌套數據。 如果我有地方臺被接合一對多表B中的數據模型,我可以在我的條件查詢使用取子句:

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
CriteriaQuery<A> cq = cb.createQuery(A.class); 
Root<A> root = cq.from(A.class); 
Fetch<A,B> fetch = root.fetch(A_.elementsOfB, JoinType.LEFT); 

這工作得很好。我得到一個元素A,並且它的所有元素都被正確填充。 現在表B與表C有一對多的關係,我也想加載它們。所以,我添加以下語句到我的查詢:

Fetch<B,C> fetch2 = fetch.fetch(B_.elementsOfC, JoinType.LEFT); 

但是這不會做任何事情。

有人知道如何在一個查詢中獲取多級實體嗎?

回答

10

它不適用於JPQL,也無法使其在CriteriaQueries中工作。規格限制獲取實體在直接從返回實體引用的那些:

關於抓取連接與CriteriaQuery中:

An association or attribute referenced by the fetch method must be referenced from an entity or embeddable that is returned as the result of the query.

關於獲取參加JPQL:

The association referenced by the right side of the FETCH JOIN clause must be an association or ele ment collection that is referenced from an entity or embeddable that is returned as a result of the query.

同樣的限制是也在OpenJPA文檔中講過。

+0

非常感謝您的回答。但是在你指出的文檔文章中有一個JPQL的例子: 'SELECT x FROM Magazine x join fetch x.articles a join fetch a.publishers p WHERE x.title ='JDJ'' 有表格x,a和p關係x-> a和a-> p。這正是我想用標準API做的事情。 – 2012-01-16 15:04:51

+0

你沒有仔細閱讀。這是導致語法錯誤的查詢的例子。該查詢之前的句子是:「以下查詢將導致語法錯誤:」。你想做什麼不起作用。 – 2012-01-16 18:24:40

+3

哦,你說得對。所以我只能說:Ooops。但無論如何......有沒有什麼做法可以解決這個問題?我想在這個世界上有很多人想要拿兩張以上的桌子。我必須先加入第二個表格還是手動讀取其他數據?最佳做法是什麼? – 2012-01-16 19:19:34

相關問題