フェッチ参加します親モデルの「子」モデルのセット)。休止クライテリアAPIの結果は、私が2つの単純なモデルを持っている
'John'に2人の子供がいる場合、上記のクエリの結果は、1つのクエリを実行することで、2人の子供を持つ2人の親(同じ参照)のリストを私に与えます。
私は以下のような基準APIを経由して同じことを達成しようとしています:上記のコードでは
Criteria c = session.createCriteria(Parent.class);
c.setFetchMode("children", FetchMode.JOIN);
c.createCriteria("children", Criteria.LEFT_JOIN);
c.add(Restrictions.eq("name", "John"));
c.scroll();
、私は1つだけ子要素(代わりの2を期待して2つの親インスタンス(同じ参照)のリストを取得します)buが単一のSQLクエリを実行しています。
私はapiで何が間違っていますか?生成されたSQLを見ると同じです。
これはHQLとCriteria APIの違いではなく、 'c.scroll()'と 'c.list()'と関係があるようです。私が質問を投稿したとき、HQLには 'query.list()'、Criteria APIには 'c.scroll()'を使いました。今私は4つのすべての組み合わせを試して、c.scroll()だけが予期しない動作をしていることを知りました。私はそれを修正する理由や方法を理解していません。 – Bhargava
'scroll'の間のように、' session'はキャッシュ内の親の識別子だけを見ていて、それを新しい子の関連付けで更新しません。しかし、 'list'はキャッシュされた親オブジェクトを新しい子の関連付けで更新しているようです。私の推論は、それは同じオブジェクトに対して2つの異なる状態を与えたくないため、さらにスクロールするときにキャッシュされたオブジェクトを再び横切る場合、そのオブジェクトを更新しないということです。私は正しい?私は 'c.setCacheable(false)' /'c.setCacheable(true)を試しました。 c.setCacheMode(CacheMode.IGNORE/REFRESH) 'を実行しても効果はありません。 – Bhargava
2つのクエリでオーダーされた親リストとオーダーされた子リストをスクロールする必要があるように見え、それらをプログラマティックに結合します。よりよいアプローチがあるのだろうかと思っています。 – Bhargava