2012-12-27 75 views
0

我有一些麻煩與JPA(休眠)和LazyFetching左連接抓取重複

我有一些實體: 任務,報酬,合同

關係(均爲懶惰):

  • Quest One2Many獎勵;追求許多許多合同;
  • Contract One2Many獎勵;合同Many2Many任務;
  • 獎勵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(); 

的問題是,我recive
一個任務有4個(但它只有2)獎勵(獎勵1,獎勵2,獎勵1,獎勵2)和兩份合同。
我得到的獎勵重複!
我不明白爲什麼!
如果我這樣做:

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

我recive一個任務有兩個獎勵(Reward1,Reward2)

爲什麼?爲什麼我有重複?

回答

3

這就是Hibernate的工作原理。它不會移除從左外連接生成的重複。你可以得到明確指定,你需要不同的結果

對於如果你使用的標準來取數據比如當你獲取數據,你可以指定

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 

退房生成的SQL。這裏有一個常見問題,解釋了爲什麼Hibernate會如此行爲here

同樣在第一個查詢中,您將在同一個SQL中加載多個集合(獎勵和合同),這可能會導致笛卡爾積。 Hibernate有一個期貨 API,它可以幫助使用比生成笛卡爾產品的SQL更簡單的SQL來加載多個子集合。 (我不確定期貨是否會與JPA合作)

0

一個表可能有更多的行,然後另一個表。所以給一些條件以避免重複...