Hibernate JPA2.1实体图返回重复的结果

Hibernate JPA2.1实体图返回重复的结果,hibernate,jakarta-ee,jpa,entitymanager,wildfly,Hibernate,Jakarta Ee,Jpa,Entitymanager,Wildfly,我开始在JPA2.1中使用新的实体图特性来指定必须加载的惰性集合。 考虑以下类: @Entity @NamedQueries({ @NamedQuery(name="findWithFilterAttr","select a from A a where a.filterAttribute like :filter") }) @NamedEntityGraphs({ @NamedEntityGraph(name = "graph.childs", attributeNodes = @Na

我开始在JPA2.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;
}
@实体
@命名查询({
@NamedQuery(name=“FindWithFilterAtr”,“从a中选择a,其中a.filterAttribute类似于:过滤器”)
})
@姓名识别图({
@NamedEntityGraph(name=“graph.childs”,attributeNodes=@NamedAttributeNode(“childs”))})
公共A类{
@身份证
私人长id;
@OneToMany(mappedBy=“家长”)
私人名单儿童;
私有字符串过滤器属性;
}
@实体
公共B类{
@身份证
私人长id;
@许多酮
父母的私人关系;
}
当我执行命名查询以获取带有entity graph提示的实体列表时,我会得到一个带有重复实体的集合。 如何仅加载一次A实体

我正在使用:

  • 休眠4.3.5
  • Wildfly 8.1

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

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 ?
使用独特和实体图进行查询:

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 ?
一小部分

我和你有同样的问题。 我认为这种行为出乎意料,可能是hibernate中的一个缺陷。 不需要指定
distinct
,因为这是直接在JPQL查询中指定的获取的情况

由于实现的局限性,您的解决方案是一个解决方案。 通过检查代码(计算方法
列表()
中的
需要识别标记,可在上找到),有两种解决方案:

  • 向查询添加限制
  • 使用不同的

注意:这是一个纯粹的休眠问题,这里没有野蝇。您应该删除标签。非常感谢您发布您的解决方案!这也适用于JPA命名查询。请参阅:您可以写下如何将distinct添加到查询中吗?