Java Hibernate返回错误的结果集并生成错误的查询

Java Hibernate返回错误的结果集并生成错误的查询,java,sql,hibernate,Java,Sql,Hibernate,我有一张桌子可以自己参考 organisation(id,child_from_Org, ...) 休眠映射 @Entity @Table(name = "organisation") public class Organisation implements java.io.Serializable { private Integer id; private Organisation organisation; private ... @Id @GeneratedVal

我有一张桌子可以自己参考

organisation(id,child_from_Org, ...)
休眠映射

@Entity
@Table(name = "organisation")
public class Organisation implements java.io.Serializable {

  private Integer id;
  private Organisation organisation;
  private ...

  @Id
  @GeneratedValue(strategy = IDENTITY)
  @Column(name = "id", unique = true, nullable = false)
  public Integer getId() {
    return this.id;
  }

  public void setId(Integer id) {
    this.id = id;
  }

  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "child_from_Org")
  public Organisation getOrganisation() {
    return this.organisation;
  }

  public void setOrganisation(Organisation organisation) {
    this.organisation = organisation;
  }
  ...
}
如果我执行一个hibernate查询,比如“来自组织”,那么我将得到所有组织

from Organisation o where o.id = 1
然后我得到id为1的组织

from Organisation o where o.id = 1 or o.organisation.id = 1
返回id为1的组织和所有子组织

from Organisation o where o.id = 1 or o.organisation.id = 1 or o.organisation.organisation.id = 1
不返回id为1的组织!!!!为什么? 我尝试了所有可能的小苞片组合(()或()或())

我觉得hibernate生成的SQL错误:

select  organisati0_.id as id470_,
  organisati0_.child_from_Org as ist21_470_,70_,
  ,...
 from
  organisation organisati0_ cross 
 join
  organisation organisati1_ 
 where
  organisati0_.child_from_Org=organisati1_.id 
  and (
   organisati0_.id=1 
   or organisati0_.child_from_Org=1 
   or organisati1_.child_from_Org=1
  )

如何解决该问题?

因为您有一个从组织到自身的隐式连接,并且在hibernate中隐式连接是内部连接:

隐式表单不使用join关键字。相反,使用点表示法“取消引用”关联。隐式联接可以出现在任何HQL子句中。隐式联接在生成的SQL语句中产生内部联接

尝试显式左连接,例如:

select o from Organisation as o left join o.organisation as parent left join parent.organisation as grandparent where o.id = 1 or parent.id = 1 or grandparent.id = 1
注意:我假设organization.organization是一种父关系。如果不是这样,您可以(也应该)用更合适的别名替换
父方
祖父母
别名)

编辑以添加:

看起来,内部联接排除了id为1的组织,可能是因为id为1的组织有一个空的
组织

再次编辑以添加:
在下面添加了“按评论选择”。

显示我们的组织映射。我已经用映射更新了问题。添加表定义也会很有帮助。谢谢,它很有效,我认为hibernate应该自动生成一个左联接。我已经用一个显式的select编辑了您的查询:
select o from Organization o left join o.Organization as parent left join parent.Organization as grandparent其中o.id=1或parent.id=1或grandparent.id=1
。否则hibernate也会返回父母和祖父母。