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 关系多次返回同一个实体的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate left join fetch 对子集执行附加查询
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?