2013-08-29 34 views
1

我有一個用戶實體和一個Pet實體。用戶和寵物之間沒有@OneToMany,@ManyToMany或其他。原因是每個用戶可能有成千上萬的寵物(至少在這個例子中)。由於我不想急於加載它(太慢),我不想延遲加載(導致延遲初始化異常......並且我不想在視圖中使用open過濾器)我已經創建了方法(原因是我想有機會只返回關係屬性的子集,我不希望所有的用戶的寵物:在實體之間沒有關係映射的情況下在JPA中加入兩個表

getPetsForUser(final User user){...}。連接的例子我已經看到了JPA顯然使用關係屬性上看來的實體。如何做到這一點的JPA?

在SQL我只想用外鍵...

回答

1

你必須明確使用外鍵,概率通過從User對象(User.getId(),我推測)中提取它,然後將其用作原始longPet上的同等字段 - 無外鍵完整性,級聯或基於查詢的聯接。

重新審視爲什麼進行懶加載工作是件壞事,以及JPA是否正確的做法可能會更好。

1

JPQL只適用於映射的實體和映射關係。
一種方法是使用本機SQL查詢並管理結果爲List<Object[]>
否則您可以解開EntityManager以獲得Hibernate Session並將結果與​​SQLQuery.setResultTransformer(new AliasToBeanResultTransformer(Pet.class))匹配。
例如:

List<Pet> getPetsForUser(final User user) { 
    Session s = entityManager.unwrap(Session.class); 
    List<Pet> pets = s.createSQLQuery("select * from PETS p inner join USERS u on (p.user_id = u.id) where u.id = :id").setParameter("id",user.getUserID()).setResultTransformer(new AliasToBeanResultTransformer(Pet.class)).list(); 
} 
+0

我知道這是老了,但仍然具有現實意義。這個答案中唯一缺少的是你需要鏈接到列表寵物列表的最後''是'.list()',否則你會得到一個錯誤:org.hibernate.internal。 SQLQueryImpl不能轉換爲java.util.List'。除此之外,這是加入非相關表並將它們作爲某種對象返回的最佳答案。 –

+1

完成。謝謝你的提示。 –

相關問題