加入Fetch for One To Many关系多次返回同一实体

时间:2016-09-15 06:52:54

标签: hibernate jpa persistence hql jpql

我有以下映射
1用户可以有0个或更多角色。

查询
来自User u JOIN Fetch u.roles

如果User1有两个角色RoleA和RoleB。
然后User1返回两次。

我期望的是User1应该返回一次包含RoleA和RoleB的角色列表 我怎样才能解决这个问题。

另请解释多对多关系的行为。

2 个答案:

答案 0 :(得分:3)

参见JPA规范4.4.5.3

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

获取连接具有与相应内部或相同的连接语义   外连接,除了指定的相关对象   查询中不返回连接操作的右侧   结果或以其他方式在查询中引用。因此,例如,如果   部门1有五名员工,上面的查询返回五名   对部门1实体的引用。

选项

  1. 您可以在DISTINCT子句中添加SELECT来过滤掉 重复的行。
  2. 为查询定义EntityGraph并向其添加roles字段, 它将被获取,这意味着您省略了查询中的"FETCH JOIN"
  3. roles字段标记为EAGER,但这会适用于该字段的所有提取,因此可能不合适。

答案 1 :(得分:2)

用户在代码下面:

criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);

有关详细信息,请查看此链接: Hibernate Criteria returns children multiple times with FetchType.EAGER