1

这是我转换为 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);

那么如何指定小部件的消息是主动获取而不是延迟获取呢?

4

2 回答 2

5

尝试获取连接,如下所示:

@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

于 2012-11-08T20:17:10.700 回答
0

在我发布这个问题后不久,我意识到我正在尝试将功能放入真正属于服务层的 DAO 层。

所以现在我Hibernate.initialize(widget.getMessages())WidgetService调用WidgetDAO.findWidget().

我真的应该一直这样做。

编辑:@MikeN 有一个很好的观点。fetch join是真正的答案,因为它独立于实现并在原始查询中获取所有必要信息。

于 2012-11-12T15:37:24.700 回答