这是之前我的查询我转换为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);
那么如何指定小部件的消息是主动提取而不是懒惰?
答案 0 :(得分:4)
尝试获取联接,如下所示:
@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
答案 1 :(得分:0)
我发布这个问题后不久,我意识到我正在尝试将功能放入真正属于服务层的DAO层。
所以现在我在调用Hibernate.initialize(widget.getMessages())
之后,在WidgetService
类中使用WidgetDAO.findWidget()
初始化延迟关联。
我一直都应该这样做。
编辑:@MikeN有一个好点。 获取连接是真正的答案,因为它与实现无关,并在原始查询中获取所有必要信息。