下面是我的两个实体:
@Entity
@Table(name = "aog_reference")
public class AogReference
{
@OneToOne(fetch = FetchType.LAZY, mappedBy="aogReference", cascade=CascadeType.ALL, optional=true)
private Pack pack;
}
@Entity
@Table(name = "pack")
public class Pack
{
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="aog_reference")
private AogReference aogReference;
}
我可以使用Hibernate读写这两个实体,并且AogReference的***pack***属性被正确填充。
但是,我正在尝试运行一个HQL查询,该查询包含AogReference实体,而这些实体没有包引用它们。
在读了大量关于这方面的材料后,我希望这能起作用:
SELECT e FROM AogReference AS e left join e.pack WHERE (e.pack IS NULL)
但是我得到0行返回,即使我知道有AogReference实体没有任何来自Pack实体的引用。
我看过上面的hql生成的SQL,它看起来像这样:
select
aogreferen0_.id as id1_0_,
aogreferen0_.active as active2_0_,
aogreferen0_.created as created3_0_,
aogreferen0_.modified as modified4_0_,
aogreferen0_.version as version5_0_,
aogreferen0_.aog_delivery_number as aog_deli6_0_,
aogreferen0_.aog_destination as aog_dest7_0_,
aogreferen0_.aog_notes as aog_note8_0_,
aogreferen0_.foc_notification_time as foc_noti9_0_,
aogreferen0_.is_collection_today as is_coll10_0_,
aogreferen0_.is_used as is_used11_0_,
aogreferen0_.work_stream as work_st12_0_
from
aog_reference aogreferen0_
left outer join
pack pack1_
on aogreferen0_.id=pack1_.aog_reference
where
aogreferen0_.id is null
或简化:
select *
from
aog_reference a
left outer join
pack p on a.id = p.aog_reference
where a.id is null
现在请注意这个巨大的错误:
where a.id is null
Hibernate完全搞错了,生成的sql应该是这样的:
select
aogreferen0_.id as id1_0_,
aogreferen0_.active as active2_0_,
aogreferen0_.created as created3_0_,
aogreferen0_.modified as modified4_0_,
aogreferen0_.version as version5_0_,
aogreferen0_.aog_delivery_number as aog_deli6_0_,
aogreferen0_.aog_destination as aog_dest7_0_,
aogreferen0_.aog_notes as aog_note8_0_,
aogreferen0_.foc_notification_time as foc_noti9_0_,
aogreferen0_.is_collection_today as is_coll10_0_,
aogreferen0_.is_used as is_used11_0_,
aogreferen0_.work_stream as work_st12_0_
from
aog_reference aogreferen0_
left outer join
pack pack1_
on aogreferen0_.id=pack1_.aog_reference
where
pack1_.id is null
请注意,最后一行现在是:
where pack1_.id is null
Hibernate生成的sql在应该检查Pack的id时却在检查AogReference上的id。
当我在我的数据库中启动它时,纠正后的sql工作正常。
在我看来,这就像是Hibernate中的一个巨大的bug,它根本没有生成正确的SQL。
任何意见(明智的)感激地收到。
谢谢你,
艾德
更新:看起来这是一个hibernate bug,它从2010年就已经存在了。
1条答案
按热度按时间ctehm74n1#
正如您已经提到的,这似乎是一个已知的hibernate bug。
对于任何遇到这个问题的人来说,一个解决方法是使用“Exists”: