2016-09-15 12 views
0

私は以下のマッピングを持っています
1ユーザは0以上のロールを持つことができます。ユーザーからの
1対多フェッチに参加多くの関係が同じエンティティを複数回返す

クエリ
uはu.roles

User1は二つの役割RoleAとRoleBを持っている場合は

を取得し、JOIN。
次に、User1が2回返されます。

私はUser1を返すべきですRoleAとRoleBを含むロールのリストを1回
どうすればこの問題を解決できますか?

また、多対多関係の動作についても説明してください。コードの下

答えて

2

JPAの仕様を参照してください。4.4.5.3

SELECT d FROM Department d LEFT JOIN FETCH d.employees WHERE d.deptno = 1 

A参加フェッチは同じを持っています対応する内部としてのセマンティクスまたは外部結合としての 外部結合としてセマンティクスを結合する結合操作の右側の で指定された関連オブジェクトがクエリ に返されないか、クエリ内で参照されていないことを確認してください。したがって、たとえば、 部門1に5人の従業員がある場合、上記の問合せでは、部門1エンティティへの参照が5つ返されます( )。

オプション

  1. あなたは 重複する行を除外するSELECT句にDISTINCTを追加することができます。
  2. クエリにはEntityGraphを定義し、 フィールドにrolesフィールドを追加します。これはフェッチされます。つまり、クエリから"FETCH JOIN"を省略します。
  3. rolesフィールドをEAGERとしてマークしますが、これはそのフィールドのすべてのフェッチに適用されるため、望ましいとは限りません。
+0

エンティティグラフチップに感謝します。 http://stackoverflow.com/questions/39507887/behavior-of-distinct-root-entityにお答えください – Piyush

2

ユーザー:詳細については

criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 

は、このリンクをチェックしてください。 Hibernate Criteria returns children multiple times with FetchType.EAGER

+0

ユーザー - >役割 - >権限が多対多の場合はどうなりますか。 条件:setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);結果を期待通りに返しますか? – Piyush