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
作为 where
的 in
子句的 source/collection 数据,这是不可能的,因为这里 c
同时是DELETE
操作的目标和in
子句的数据源,这在查询中造成混淆。
正如您已经做的那样,您需要将 articles
的集合作为参数传递而不在 where
子句中引用 c
以避免此问题。
我正在使用 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
作为 where
的 in
子句的 source/collection 数据,这是不可能的,因为这里 c
同时是DELETE
操作的目标和in
子句的数据源,这在查询中造成混淆。
正如您已经做的那样,您需要将 articles
的集合作为参数传递而不在 where
子句中引用 c
以避免此问题。