1

コレクション要素に独自のコレクションがある場合、基本的なクエリが機能しないようです。

ポートフォリオを持ち、投資を行う顧客を持つ銀行のデータ モデルを想像してみてください。集客の正しい方法とは?

私はこれを試しました:

@Query("SELECT DISTINCT c FROM Customer c LEFT JOIN FETCH c.portfolios")

しかし、「ロールのコレクションを遅延して初期化できませんでした」で失敗します。

投資は次のように定義されます。

@ManyToMany(cascade = CascadeType.ALL)

fecthType を変更すると、クエリが機能します。

@ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER)

しかし、fetchtype を変更せずに動作させる方法はありますか?

編集:

上記のクエリを定義するために Spring の JpaRepository を使用したことを言及しておく必要があります。すべてのエンティティにはそれぞれのリポジトリがありますが、Customers をフェッチしても Portfolios リポジトリのメソッドに触れないように見えます (これは、投資を LEFT JOIN します)。そのため、投資は決してフェッチされません。

また、同様のクエリを使用してポートフォリオをフェッチすることもできます。Investment にはコレクションがないため、正常に動作します。しかし、チェーン顧客 -> ポートフォリオ -> 投資の取得は失敗します。

4

1 に答える 1

2

クエリは、顧客を選択し、left join fetch. ポートフォリオの投資もフェッチしたい場合は、SQL の場合と同様に、追加の結合フェッチが必要です。

select distinct c FROM Customer c 
left join fetch c.portfolios portfolio
left join fetch portfolio.investments
于 2013-04-08T13:43:09.363 に答える