我正在使用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'是 指定两次,既作为“删除”的目标,又作为单独的目标 数据来源
答案 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
来避免此问题。