我可以用join语句执行批量删除吗?

时间:2013-07-25 14:43:01

标签: hibernate

我正在尝试使用jpql执行以下批量删除:

            " DELETE " +
            " FROM AutAnt aa " +
            "   JOIN aa.person p " +
            "   JOIN p.employees e" +  
            " WHERE e = :employess " +
            "   AND (" +
            "       aa.dateFrom BETWEEN :dateStart AND :dateEnd" +
            "       OR" +
            "       aa.dateTor BETWEEN :dataStart AND :dateEnd" +
            "   )");

但是我收到了这个错误:

unexpected token: JOIN

JPA docs状态“按查询删除使用与普通查询相同的JPQL语法,但有一个例外:使用delete关键字而不是select关键字开始查询字符串”

我有以下选择查询,它完美无缺:

            " SELECT aa " +
            " FROM AutAnt aa " +
            "   JOIN aa.person p " +
            "   JOIN p.employees e" +  
            " WHERE e = :employess " +
            "   AND (" +
            "       aa.dateFrom BETWEEN :dateStart AND :dateEnd" +
            "       OR" +
            "       aa.dateTor BETWEEN :dataStart AND :dateEnd" +
            "   )");

将删除查询的第一个语句更改为“删除aa”会引发另一个异常。

这是一个Hibernate错误,还是我在这里遗漏了一些东西。

干杯!

1 个答案:

答案 0 :(得分:0)

Hibernate批量DML操作不支持联接。来自documentation

  

Section 16.4, “Forms of join syntax”,隐式或   显式,可以在批量HQL查询中指定。子查询可以   在where子句中使用,子查询本身可以包含   联接。

正如文档中所建议的,您可以在子查询的帮助下在语义上编写相同的语句:

delete AutAnt where id in
  (select aa.id from AutAnt aa join aa.person p ...)