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

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

查询
from User u JOIN Fetch u.roles

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

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

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

【问题讨论】:

    标签: hibernate jpa persistence hql jpql


    【解决方案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 实体的引用。

    选项

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    • 2010-12-08
    相关资源
    最近更新 更多