0

JPA(Hibernate)とLazyFetchingに問題があります

私はいくつかのエンティティを持っています:クエスト、報酬、契約

関係(すべてレイジー):

  • クエスト One2Many 報酬; クエスト Many2Many 契約;
  • 契約 One2Many 報酬; Many2Many クエストを契約します。
  • Many2One クエリに報酬を与える。Many2One 契約に報酬を与える。

DB には次のデータが含まれています。Quest1 には Reward1、Reward2、および Contract1、Contract2 があります。

場合によっては、報酬と契約を備えたクエストが必要になるため、JPArepository で行います。

@Query("select Q from Quest Q left join fetch Q.rewards left join fetch Q.contracts")
List<Quest> getAllQuestsWithRewardsAndContracts();

問題は、
4つ(ただし2つしかない)の報酬(Reward1、Reward2、Reward1、Reward2)と2つのContractを含む1つのクエストを受け取ることです。
報酬が重複します!
理由がわかりません!
私がそうする場合:

@Query("select distinct Q from Quest Q left join fetch Q.rewards")
List<Quest> getAllQuestsWithRewardsRew();

2つの報酬(Reward1、Reward2)で1つのクエストを受け取ります

なんで ?重複があるのはなぜですか?

4

2 に答える 2

5

これが、Hibernate が機能する性質です。LEFT OUTER JOINS から生成された重複は削除されません。明確な結果が必要であることを明示的に指定できます

たとえば、条件を使用してデータをフェッチする場合は、次のように指定できます

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

データをフェッチするときに生成される SQL を確認してください。Hibernate がこのように動作する理由について詳しく説明している FAQ を次に示します。

また、最初のクエリでは、同じ SQL で複数のコレクション (報酬と契約) をロードしているため、デカルト積になる可能性があります。Hibernate には、デカルト積を生成するものよりも単純な SQL を使用して複数の子コレクションをロードするのに役立つFutures API があります。(FuturesがJPAで機能するかどうかはわかりません)

于 2012-12-27T16:35:13.883 に答える
0

1 つのテーブルに別のテーブルよりも多くの行がある場合があります。したがって、重複を避けるためにいくつかの条件を与えてください...

于 2012-12-27T14:52:26.497 に答える