代码之家  ›  专栏  ›  技术社区  ›  Stefan Hendriks

hibernate;hql;为什么删除查询不起作用,但select起作用?

  •  5
  • Stefan Hendriks  · 技术社区  · 15 年前

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

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

    下面是使用的HQL示例:

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

    基本上,这应该删除所有的行程预订(单独表中的记录),这些都将加入到预订表中。预订表可以与用户表连接。

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

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

    然后执行一个query.list(),就可以了。

    每当我想执行delete变量时,Hibernate都会生成一个奇数的delete语句。我的HQL错误吗?还是冬眠怪癖?

    2 回复  |  直到 13 年前
        1
  •  7
  •   Johny T Koshy    13 年前

    hibernate manual 以下内容:

    没有隐式或显式连接, 可以在批量HQL查询中指定。 子查询可用于 WHERE子句,其中子查询 它们本身可以包含联接。

    你的 ib.booking.user.id 子句对我来说像是一个联接。我不知道Hibernate是主动拒绝DELETE语句中的联接,还是只是默默地出错。

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

        2
  •  0
  •   Omar Al Kababji    15 年前

    可能有帮助的简单问题:

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

    2. 执行删除hql后是否刷新会话?

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