2017-03-16 4 views
1

openJPAとmysqlで削除クエリを実行したい。OpenJPA/MySQL:where句で同じテーブルが使用されている間にテーブルを変更する

このmysqlの文は正常に動作します:

delete from GENERIC 
where PARENT_ID not in (select g2.ID from (select * from GENERIC) g2); 

基本的な要素は、そのクラスの(ID部材にGenericEntityクラス、ID列にGENERIC表のマッピング列IDとPARENT_ID

とGENERIC表です)とPARENT_ID列PARENTIDメンバーに、私はこの簡単なテストを試みた:

entityManager.createQuery("delete from GenericEntity g1 where " + 
    "g1.parentId not in " + 
    "(select g2.id from (select * from GenericEntity) g2)" 
).executeUpdate(); 

をそして、私はこのエラーを取得する:

org.apache.openjpa.persistence.ArgumentException: "Encountered "g1 . parentId not in (select g2 . id from (" at character 36, but expected: ["(", "*", "+", ",", "-", ".", "/", ":", "<", "<=", "<>", "=", ">", ">=", "?", "ABS", "ALL", "AND", "ANY", "AS", "ASC", "AVG", "BETWEEN", "BOTH", "BY", "CASE", "CLASS", "COALESCE", "CONCAT", "COUNT", "CURRENT_DATE", "CURRENT_TIME", "CURRENT_TIMESTAMP", "DELETE", "DESC", "DISTINCT", "ELSE", "EMPTY", "END", "ENTRY", "ESCAPE", "EXISTS", "FETCH", "FROM", "GROUP", "HAVING", "IN", "INDEX", "INNER", "IS", "JOIN", "KEY", "LEADING", "LEFT", "LENGTH", "LIKE", "LOCATE", "LOWER", "MAX", "MEMBER", "MIN", "MOD", "NEW", "NOT", "NULL", "NULLIF", "OBJECT", "OF", "OR", "ORDER", "OUTER", "SELECT", "SET", "SIZE", "SOME", "SQRT", "SUBSTRING", "SUM", "THEN", "TRAILING", "TRIM", "TYPE", "UPDATE", "UPPER", "VALUE", "WHEN", "WHERE", , , , , , , , , ]." while parsing JPQL "delete from GenericEntity g1 where g1.parentId not in (select g2.id from (select * from GenericEntity) g2)". See nested stack trace for original parse error.

私は異なるバリエーションを試しましたが、代わりに(削除された 'フラグを設定するための)更新によって削除を置き換えましたが、この非常にテーブルがどこで使用されているかによってテーブルを変更するのが一般的な問題です句。

私は非常に多くのヒント、どのように続行するか、有益な資料へのリンクをありがとうと思います。 ありがとうございます!

+0

エラーメッセージは、ないのmysqlから、JPQLから来ています。 – Shadow

答えて

0

多くの研究の後、私は解決策を見つけました。これは、delete文にパラメータとしてIDのリストを削除クエリからの選択を分離し、合格するために正常に動作します:私は質問を再びタグ付けthetefore

List<Integer> idList = entityManager 
    .createQuery("select g.id from GenericEntity g",Integer.class) 
    .getResultList(); 
entityManager 
    .createQuery("delete from GenericEntity g where g.parentId not in (:idList)") 
    .setParameter("idList", idList) 
    .executeUpdate(); 
関連する問題