[英]How can I initialize lazy associations using Spring Data JPA when the query is specified in @Query annotation?
這是我轉換為Spring Data JPA 之前的查詢。 請注意,我以前是如何使用Hibernate.initialize()
手動獲取窗口小部件的消息的。
public Object findWidget(final Widget findMe) {
Widget widget = getJpaTemplate().execute(new JpaCallback<Widget>() {
public Widget doInJpa(EntityManager em) throws PersistenceException {
Query q = em.createQuery("SELECT h FROM " + entityClass.getName() + " h where h.widgetId = ? ");
q.setParameter(1, findMe.getId());
Widget found = (Widget)q.getSingleResult();
//Initialize lazy associations
if(found!= null){
Hibernate.initialize(widget.getMessages());
}
return found;
}
});
return widget;
}
這就是我的查詢功能現在的樣子。 請注意,沒有可以放入Hibernate.initialize()
主體。
@Query("SELECT h FROM Widget h where h.widgetId = ?1 ")
public AccessPoint findWidget(String widgetId);
因此,如何指定要主動而不是懶惰地獲取小部件的消息?
嘗試獲取聯接,如下所示:
@Query("SELECT h FROM Widget h LEFT JOIN FETCH h.messages WHERE h.widgetId = ?1 ")
public AccessPoint findWidget(String widgetId);
http://docs.oracle.com/html/E24396_01/ejb3_langref.html#ejb3_langref_fetch_joins
發布此問題后不久,我意識到我正在嘗試將功能放入真正屬於服務層的DAO層。
所以現在我在調用WidgetDAO.findWidget()
之后,使用WidgetService
類中的Hibernate.initialize(widget.getMessages())
來初始化惰性關聯。
我真的應該一直這樣做。
編輯:@MikeN有一個好點。 提取聯接是真正的答案,因為它與實現無關,並且在原始查詢中獲取所有必需的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.