0

私は次の構造を持っています

ストア
リベート リベート
メタデータ リベート
コミッション

つまり、関係は次のようになります -

Store -> Rebate は 1 対多の関係です Rebate -> RebateMetadata は 1 対 1 のマッピングです Rebate -> RebateCommission は 1 対 1 のマッピングです

私のクエリは、すべてのストアをロードすることです。そして、すべてのリベート、メタデータ、コミッションをロードします。

私が使用しているHQLは次のとおりです。

ストアとしてストアからストアを選択します。

グラフ全体ができるだけ少ない SQL でロードされることを期待しています。n+1 選択の問題を防ぐために、Store->Rebate 間でサブセレクト フェッチを使用します。

ただし、RebateMetadata と RebateCommission を取得するために、複数の個別の選択 (結合を使用) が起動されていることがわかります。これを最小限に抑えるにはどうすればよいですか?

また、2次キャッシュはONにしていますが、QueryCacheはOFFにしています。

4

1 に答える 1

0

fetch joinを試すことができます。通常、正しく理解するにはしばらく時間がかかります。次のようなことを試してください。

select store from Store as store 
 left join fetch store.rebate rebate
 inner join fetch rebate.metadata 
 inner join fetch rebate.commission

edit : 休止状態のドキュメントでリンクした最後から 2 番目の例に従って更新されました。これは正しい可能性が高くなります。

それはおそらくうまくいかないでしょうが、それは一般的な考えです。または、プロパティでbatch-size (注釈@BatchSize) を使用して、このようなプロパティが一度に 50 項目ずつ読み込まれるようにすることもできます (SELECT...IN クエリを使用)。

于 2010-06-25T10:03:31.720 に答える