我有一张可以参考的表格。
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;
}
...
}
如果我执行一个休眠查询,例如“来自组织”,那么我将获得所有组织。
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的组织!!!!为什么?我尝试使用手镯(()或()或())进行所有可能的组合。
我似乎从休眠中生成了错误的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
)
我该如何解决这个问题?
因为您有一个Organisation
到自身的隐式联接,所以在休眠状态下,隐式联接就是内部联接:
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是父级关系。如果不是这种情况,则可以(并且应该)用更合适的名称替换parent
andgrandparent
别名)
编辑添加:
似乎正在发生的事情是内部联接排除了ID为1的org,这可能是因为id为1的组织具有null organisation
再次编辑:在下面添加了每个评论的选择。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句