HQL - Table 被指定了两次,既作为 'DELETE' 的目标又作为单独的数据源

HQL - Table is specified twice, both as a target for 'DELETE' and as a separate source for data

我正在使用 Hibernate 4.3

我有 OneToMany 命令 --> 文章

我想删除与 文章 相关的 Commande。 首先,我尝试 select 所需的 Commande 列表。

        Query querydeleteCmd = em.createQuery("select c from Commande c where (:art) in elements(c.articles)");
        querydeleteCmd.setParameter("art", new Article(1));
        List<Commande> commandes = querydeleteCmd.getResultList();
        commandes.forEach(System.out::println);

这很好用,但是当我想删除时(几乎是同一个查询):

        Query querydeleteCmd = em.createQuery("delete from Commande c where (:art) in elements(c.articles)");
        querydeleteCmd.setParameter("art", new Article(1));
        querydeleteCmd.executeUpdate();

这给了我:

Caused by: java.sql.SQLException: Table 'Commande_Article' is specified twice, both as a target for 'DELETE' and as a separate source for data

据我了解: 问题是我无法在 "where".

子句中指定要删除的内容
delete from Commande c where (:art) in elements(c.articles)

所以这里我不能在子句"where"

中使用"c"

这就是我所做的并且效果很好:

1) 我select要删除的Commande列表

Query querydeleteCmd = em.createQuery("select c from Commande c where (:art) in elements(c.articles)");
querydeleteCmd.setParameter("art", new Article(1));
List<Commande> commandes = querydeleteCmd.getResultList();

2) 然后我使用第一个查询的结果删除所有 Commande :

    Query queryDeleteCommande = em.createQuery("delete from Commande c where c in (:commandes)");
    queryDeleteCommande.setParameter("commandes", commandes);
    int countDeletedCommandes= queryDeleteCommande.executeUpdate();

可能有更好的方法一次完成。

例外说:

Table 'Commande_Article' is specified twice, both as a target for 'DELETE' and as a separate source for data

这是因为您使用 c.articles 作为 wherein 子句的 source/collection 数据,这是不可能的,因为这里 c同时是DELETE操作的目标和in子句的数据源,这在查询中造成混淆。

正如您已经做的那样,您需要将 articles 的集合作为参数传递而不在 where 子句中引用 c 以避免此问题。