2011-03-14 2 views
2

나는 학생이 들어있는 그룹이 들어있는 학교가 있습니다."grand children"요소를 모두 제거하는 Hibernate HQL 질의를 작성하는 방법?

특정 학교의 모든 학생을 삭제하고 싶습니다.

SQL에서 나는 다음과 같은 쿼리를 작성할 수 있습니다

DELETE FROM students1 
WHERE students1.group_id IN 
     (SELECT id FROM group1 WHERE group1.school_id = :school_id) 

방법 HQL을 최대 절전 모드로 전환이 SQL 쿼리를 변환 할 수 있습니까?

나는 H2 데이터베이스 엔진을 사용합니다.

(내 실제 검색어는 더 복잡하고 간단한 계단식 삭제가 적합하지 않습니다.)

String hql="delete from Student where group.school=:school"; 
session.createQuery(hql).setParameter("school", schoolObject).executeUpdate(); 
+0

흠, 바로 가기를 찾고 있습니까? 이 쿼리를 HQL로 직접 변환 할 수 있기 때문입니다. Hql은 IN 조건을 지원합니다. –

+0

@ doc_180 HQL에서'students.group.school.id'를 시도했지만 작동하지 않습니다. 자바 테이블 클래스는 학생과 관계가 있습니다 : @ManyToOne @JoinColumn (name = "group") private 그룹 그룹; SQL의 경우 간단히 ID를 사용할 수 있지만 클래스 이름을 사용하여 참조해야하는 Java 클래스에서이 작업을 수행하지는 못했지만이 작업은 자주 수행해야하며 사소한 솔루션이어야합니다. – sergtk

+1

네, 사소한 문제가 있습니다. 해결책. student.group.school.id를 사용하지 마십시오. 엔티티들 사이에는 관계가 있으므로 in 절에있는 엔티티를 직접 사용하십시오. Student.group (학교에서 선택) 그룹에서 g 선택 –

답변

3

실무 스크립트는 다음과 의견에

DELETE FROM Student AS s 
WHERE s IN 
    (SELECT s FROM Student AS s WHERE s.group IN 
     (SELECT g FROM Group AS g WHERE g.school IN 
      (SELECT s FROM School s WHERE s.id = :schoolId))) 

감사합니다 of doc_180

+0

뭔가 나를 위해 일한 :'TableName에서 삭제 어디 ColumnName (테이블에서 ID를 선택하십시오.)' – rogerdpack

0

이 시도

DELETE FROM Student st 
WHERE st IN (
    SELECT st 
    FROM School s JOIN s.groups g JOIN g.students st 
    WHERE s = :s 
) 
+0

org.hibernate.util.JDBCExceptionReporter에 "SQL 구문의 구문 오류 ..."메시지가 표시됩니다. – sergtk

1

당신은 (삭제 등) Hibernate의 대량 쿼리 (명시 적 또는 암시 적 중 하나) JOIN를 사용할 수 없지만 다음과 같이 서브 쿼리에서 뭔가를 사용할 수 있습니다 :

+0

모호한 열 이름 "ID"를 가져옵니다. 오류 – sergtk

관련 문제