JPA 2.1 实体图返回重复结果

2023-11-23

我开始使用 JPA 2.1 中的新实体图功能来指定必须加载的惰性集合。 考虑以下课程:

@Entity
@NamedQueries({
    @NamedQuery(name="findWithFilterAttr","select a from A a where a.filterAttribute like :filter")
})
@NamedEntityGraphs({
@NamedEntityGraph(name = "graph.childs", attributeNodes = @NamedAttributeNode("childs"))})
public class A{
  @Id
  private long id;
  @OneToMany(mappedBy="parent")
  private List<B> childs;
  private String filterAttribute;
}
@Entity
public class B{ 
  @Id
  private long id;
  @ManyToOne
  private A parent;
}

当我执行命名查询以获取带有实体图提示的 A 实体列表时,我得到一个包含重复 A 实体的集合。 如何仅加载 A 实体一次。

我在用着:

  • 休眠4.3.5
  • 野蝇8.1

我终于解决了这个问题,我将 DISTINCT 添加到命名查询中,现在一切正常...... 导致该错误的原因是,当 JPA 提供程序找到实体图提示时,它会与子表创建 LEFT JOIN。 没有实体图的原始查询:

11:55:28,950 INFO  [stdout] (default task-23) Hibernate: 
11:55:28,950 INFO  [stdout] (default task-23)     select
11:55:28,951 INFO  [stdout] (default task-23)         entitya0_.id as id1_0_0_,
11:55:28,951 INFO  [stdout] (default task-23)         childs1_.id as id1_1_1_,
11:55:28,951 INFO  [stdout] (default task-23)         entitya0_.filter as filter2_0_0_,
11:55:28,951 INFO  [stdout] (default task-23)         childs1_.parent_id as parent_i2_1_1_,
11:55:28,951 INFO  [stdout] (default task-23)         childs1_.parent_id as parent_i2_0_0__,
11:55:28,951 INFO  [stdout] (default task-23)         childs1_.id as id1_1_0__ 
11:55:28,951 INFO  [stdout] (default task-23)     from
11:55:28,951 INFO  [stdout] (default task-23)         EntityA entitya0_ 
11:55:28,951 INFO  [stdout] (default task-23)     left outer join
11:55:28,952 INFO  [stdout] (default task-23)         EntityB childs1_ 
11:55:28,952 INFO  [stdout] (default task-23)             on entitya0_.id=childs1_.parent_id 
11:55:28,952 INFO  [stdout] (default task-23)     where
11:55:28,952 INFO  [stdout] (default task-23)         entitya0_.filter like ?

使用不同图和实体图进行查询:

11:57:25,051 INFO  [stdout] (default task-24) Hibernate: 
11:57:25,052 INFO  [stdout] (default task-24)     select
11:57:25,052 INFO  [stdout] (default task-24)         distinct entitya0_.id as id1_0_0_,
11:57:25,052 INFO  [stdout] (default task-24)         childs1_.id as id1_1_1_,
11:57:25,052 INFO  [stdout] (default task-24)         entitya0_.filter as filter2_0_0_,
11:57:25,052 INFO  [stdout] (default task-24)         childs1_.parent_id as parent_i2_1_1_,
11:57:25,052 INFO  [stdout] (default task-24)         childs1_.parent_id as parent_i2_0_0__,
11:57:25,052 INFO  [stdout] (default task-24)         childs1_.id as id1_1_0__ 
11:57:25,052 INFO  [stdout] (default task-24)     from
11:57:25,052 INFO  [stdout] (default task-24)         EntityA entitya0_ 
11:57:25,052 INFO  [stdout] (default task-24)     left outer join
11:57:25,052 INFO  [stdout] (default task-24)         EntityB childs1_ 
11:57:25,052 INFO  [stdout] (default task-24)             on entitya0_.id=childs1_.parent_id 
11:57:25,052 INFO  [stdout] (default task-24)     where
11:57:25,052 INFO  [stdout] (default task-24)         entitya0_.filter like ?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPA 2.1 实体图返回重复结果 的相关文章

随机推荐