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

时间:2014-02-04 15:24:31

标签: java sql hibernate

我有一张可以自行表达的桌子。

organisation(id,child_from_Org, ...)

Hibernate Mapping

@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为

的组织
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的组织!!!!为什么? 我尝试了所有与braclets(()或()或())的组合。

我看起来像是从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
  )

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

因为你有一个从Organisation到它自己的隐式连接,而在hibernate中,隐式连接是内部连接:

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html#queryhql-joins-forms

  

隐式表单不使用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.organisation是父关系。如果不是这样,你可以(并且应该)替换parentgrandparent别名用更合适的东西)

已编辑添加:

似乎正在发生的事情是内部联接排除id为1的org,可能是因为id为1的org有一个null organisation

再次编辑: 在下面添加了每个评论的选择。