1

SpringDataJPAに変換するのクエリは次のとおりです。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には良い点があります。フェッチ結合は実装に依存せず、元のクエリで必要なすべての情報を取得するため、本当の答えです。

于 2012-11-12T15:37:24.700 に答える