2011-03-14 1 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データベースエンジンを使用しています。

(私の実際のクエリはより複雑で簡単なカスケード削除は私には適していません)

+0

ええ、ショートカットをお探しですか?この問合せを直接HQLに変換できるためです。 HqlはIN条件をサポートしています。 –

+0

@ doc_180 HQLでは 'students.group.school.id'を試しましたが、これはうまくいきません。 Javaテーブルクラスは、学生のための関係を持っています:@ManyToOne @JoinColumn(name = "group")プライベートグループグループ。 SQLの場合は単純にidsを使うことができますが、Javaクラスではクラス名を使って参照する必要がありますが、これは以前は行いませんでしたが、これは頻繁な作業であり、簡単な解決策であると思われます – sergtk

+1

はい、溶液。 student.group.school.idは使用しないでください。エンティティ間には関係があるため、in節のエンティティを直接使用してください。 Student.group in(学校から選択したグループのグループから選択) –

答えて

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

感謝をdoc_180

+0

このようなものは私のために働いた: 'TableNameからの削除where ColumnName in(select id from Table ...)' – rogerdpack

0

これを試してみてください:

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

の下に投稿しました。org.hibernate.util.JDBCExceptionReporterは "SQL文の構文エラー"というメッセージでスローされました。 – sergtk

1

あなたは現在(削除など)Hibernateのバルククエリで(明示的または暗黙的のいずれか)JOINを使用することはできませんが、サブクエリでそれらを使用することができ、このような何か:

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

あいまいな列名 "ID"を取得します。エラー – sergtk

関連する問題