1

クエリDELETEが失敗します。

これが私のコードです:

String q = "SELECT p.id FROM Person p, DomainGroup g WHERE 
   p member of g.coordinators" + " AND g.id = :groupId 
   AND p.id = :personId";

List<Long> test = getEntityManager()
  .createQuery(q).setParameter("groupId", followingId)
  .setParameter("personId", followerId).getResultList();

log.debug("test = " + test);

String deleteGroupCoordinatorQuery = 
  "DELETE FROM Person p, DomainGroup g WHERE p member 
     of g.coordinators" + " AND g.id = :groupId 
        AND p.id = :personId";

List<Long> test = getEntityManager()
      .createQuery(deleteGroupCoordinatorQuery).setParameter
      ("groupId", followingId)
      .setParameter("personId", followerId).executeUpdate();

出力:

test = [1,2,3]

2012-10-26 13:44:56,437 ERROR org.company.commons.server.service.ServiceActionController - Error occurred performing transaction. java.lang.IllegalArgumentException: node to traverse cannot be null!
        at org.hibernate.hql.ast.util.NodeTraverser.traverseDepthFirst(NodeTraverser.java:55)
        at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:280)
        at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:182)
        at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
4

2 に答える 2

6

複数の「クエリルート」(Person pおよびDomainGroup g)を定義しますが、DELETEクエリはそのようなルートを1つだけ持つことができます。

あなたは次のようなものが欲しいです:

delete Person p
where p.id in (
    select c.id
    from DomainGroup g
        join g.coordinators c
    where g.id = :groupId
      and c.id = :personId
)

また

delete Person p
where p.id = :personId
  and p.id in (
    select c.id
    from DomainGroup g
        join g.coordinators c
    where g.id = :groupId
)
于 2012-10-26T15:45:37.703 に答える
0

機能を使用しない場合はon delete cascade、オブジェクトを削除する前に、オブジェクトへのすべての参照を削除する必要があります。

于 2012-10-26T16:27:18.213 に答える