【问题标题】:Hibernate; HQL; why does the delete query not work, but select does?休眠;高品质;为什么删除查询不起作用,而选择却起作用?
【发布时间】:2011-01-07 07:28:16
【问题描述】:

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

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

以下是使用的 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(),就可以正常工作了。

每当我想执行删除变体时,Hibernate 似乎都会生成一个奇怪的删除语句。我的 HQL 错了吗?还是 Hibernate 的怪癖?

【问题讨论】:

    标签: java hibernate hql


    【解决方案1】:

    来自hibernate manual

    没有连接,无论是隐式的还是显式的, 可以在批量 HQL 查询中指定。 子查询可用于 where子句,子查询在哪里 它们本身可能包含连接。

    您的ib.booking.user.id 子句对我来说似乎是一个联接。我不知道 Hibernate 是主动拒绝在 delete 语句中加入,还是只是默默地弄错了。

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

    【讨论】:

    • 是的,你是对的,它们是连接。我将研究级联删除功能,因为我相信它应该像那样工作,但它根本没有。必须明确删除其他相关记录是有原因的。感谢您的回答!
    【解决方案2】:

    可能有帮助的简单问题:

    1. 出于好奇,您是否在事务中运行此 HQL? selects 不需要事务,但 deletes 确实需要它。

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

    3. 您是在同一事务中还是在单独的事务中删除和选择?

    【讨论】:

    • 1.删除是在一个事务中 2. 是 3. 单独的事务
    • 可能你有一些缓存问题?我的意思是数据已从数据库中删除但仍存在于内存中?在执行查询之前尝试刷新会话,这可能会有所帮助。
    猜你喜欢
    • 2015-10-01
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多