Join Fetch for One To Many 关系多次返回同一个实体

Posted

技术标签:

【中文标题】Join Fetch for One To Many 关系多次返回同一个实体【英文标题】:Join Fetch for One To Many relationship is returning same entity multiple times 【发布时间】:2017-01-23 02:27:14 【问题描述】:

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

查询 from User u JOIN Fetch u.roles

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

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

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

【问题讨论】:

【参考方案1】:

用户下面的代码:

criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);

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

【讨论】:

如果我有用户 -> 角色 -> 权限所有多对多会发生什么。将criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);按预期返回结果?【参考方案2】:

请参阅 JPA 规范 4.4.5.3

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

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

选项

    您可以在SELECT 子句中添加DISTINCT 以过滤掉 重复的行。 为查询定义一个EntityGraph 并将roles 字段添加到其中, 它将被提取,这意味着您在查询中省略了"FETCH JOIN"。 将 roles 字段标记为 EAGER,但这将应用于该字段的所有提取,因此可能不理想。

【讨论】:

感谢实体图提示。请回复***.com/questions/39507887/… 一位同事告诉我,出于性能原因,您可能希望将 .setHint("hibernate.query.passDistinctThrough", false) 添加到带有“DISTINCT”的命名查询中,如此处所述 (vladmihalcea.com/jpql-distinct-jpa-hibernate )

以上是关于Join Fetch for One To Many 关系多次返回同一个实体的主要内容,如果未能解决你的问题,请参考以下文章

many-to-one和one-to-many的配置比较

Hibernate一对多配置测试

Hibernate left join fetch 对子集执行附加查询

hibernate映射文件one-to-one元素属性

Attempting to fetch value instead of handling error Internal: failed to get device attribute 13 for

ClickHouseHow to create index for Map Type Column or one key of it?