2017-03-16 64 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和PARENT_ID

映射的GENERIC表GenericEntity類,ID列到ID構件的表(該類別的)和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

錯誤消息來自JPQL,而不是從MySQL,thetefore我重新標記問題。 – Shadow

回答

0

經過大量的研究,我發現了一個解決方案。它工作正常,以選擇從刪除查詢分開,並通過ID列表作爲參數傳遞給delete語句:

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(); 
相關問題