Hibernate的; HQL;为什么删除查询不起作用,但选择呢?

时间:2010-01-20 14:45:31

标签: java hibernate hql

我想从表中删除某些记录。这些记录在其他表中有一些子记录。

为了能够删除主记录,我必须先删除子记录。

以下是使用的HQL示例:

delete from ItineraryBooking ib where ib.booking.user.id = :paramId

基本上,这应该删除所有ItineraryBookings(单独表中的记录),这些都加入了Booking表。 Booking表可以与User表连接。

奇怪的是,当您将上述内容更改为:

from ItineraryBooking ib where ib.booking.user.id = :paramId

执行Query.list(),它会正常工作。

每当我想执行delete变体时,看起来Hibernate会生成一个奇怪的删除语句。我的HQL错了吗?或者它是Hibernate的怪癖?

2 个答案:

答案 0 :(得分:7)

来自hibernate manual

  

没有隐式或显式的连接,   可以在批量HQL查询中指定。   可以在子查询中使用子查询   where子句,子查询所在的位置   它们本身可能包含连接。

您的ib.booking.user.id子句看起来像是对我的加入。我不知道Hibernate是否主动拒绝删除语句中的连接,或者只是默默地弄错了。

删除子记录的更好方法是使用cascading deletes

答案 1 :(得分:0)

可能有帮助的简单问题:

  1. 只是出于好奇,你在交易中运行这个HQL吗?选择不需要事务,但删除确实需要它。

  2. 您是否在执行删除HQL后刷新会话?

  3. 您是在删除,在同一交易中选择还是在单独的交易中选择?