HQL-表被指定两次,既作为“删除”的目标,又作为单独的数据源

时间:2018-12-17 17:42:22

标签: java hibernate hql

我正在使用Hibernate 4.3

我有一个一对多 Commande -> 文章

我要删除与一个文章相关的 Commande 。 首先,我尝试选择所需的 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();

这给了我:

  

由于:java.sql.SQLException:表'Commande_Article'是   指定两次,既作为“删除”的目标,又作为单独的目标   数据来源

2 个答案:

答案 0 :(得分:1)

据我了解: 问题是我无法在子句"where"中指定要删除的内容。

delete from Commande c where (:art) in elements(c.articles)

所以在这里我不能在条款"c"中使用"where"

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

1)我选择要删除的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();

也许有更好的方法可以一次完成。

答案 1 :(得分:1)

例外说明:

  

表'Commande_Article'被指定两次,既作为'DELETE'的目标,又作为数据的单独来源

这是由于您使用c.articles作为in的{​​{1}}子句的数据源/集合的事实,这是不可能的,因为在这里where同时是c操作的目标和DELETE子句的数据源,这在查询中造成混淆。

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