Как написать Hibernate HQL-запрос, который удалит все элементы «внуков»? - PullRequest
2 голосов
/ 14 марта 2011

У меня есть школы, в которых есть группы, в которых есть учащиеся.

Я хотел бы удалить всех учащихся из конкретной школы.

В SQL я могу написать следующий запрос:

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

Как преобразовать этот SQL-запрос в Hibernate HQL?

Я использую ядро ​​базы данных H2.

(Мой реальный запрос более сложный и простой каскадное удаление школы не подходитдля меня).

Ответы [ 3 ]

3 голосов
/ 15 марта 2011

Рабочий скрипт выглядит следующим образом:

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

1 голос
/ 14 марта 2011

Вы не можете использовать JOIN (явный или неявный) в массовых запросах Hibernate (например, удаления), но вы можете использовать их в подзапросах, что-то вроде этого:

DELETE FROM Student st
WHERE st IN (
    SELECT st 
    FROM School s JOIN s.groups g JOIN g.students st
    WHERE s = :s
)
0 голосов
/ 14 марта 2011

Попробуйте это:

 String hql="delete from Student where group.school=:school";
 session.createQuery(hql).setParameter("school", schoolObject).executeUpdate();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...