簡體   English   中英

在@Query注釋中指定查詢時,如何使用Spring Data JPA初始化惰性關聯?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM