我想从表中删除某些记录。这些记录在其他表中有一些子记录。
为了能够删除主记录,我必须先删除子记录。
以下是使用的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的怪癖?
答案 0 :(得分:7)
没有隐式或显式的连接, 可以在批量HQL查询中指定。 可以在子查询中使用子查询 where子句,子查询所在的位置 它们本身可能包含连接。
您的ib.booking.user.id
子句看起来像是对我的加入。我不知道Hibernate是否主动拒绝删除语句中的连接,或者只是默默地弄错了。
删除子记录的更好方法是使用cascading deletes。
答案 1 :(得分:0)
可能有帮助的简单问题:
只是出于好奇,你在交易中运行这个HQL吗?选择不需要事务,但删除确实需要它。
您是否在执行删除HQL后刷新会话?
您是在删除,在同一交易中选择还是在单独的交易中选择?