2017-03-16 1 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 컬럼에 일반 테이블 매핑 열 ID 및 PARENT_ID

와 GENERIC 테이블입니다)와 parentId 회원에 PARENT_ID 열,이 간단한 테스트를 시도 :

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();