Возможно ли массовое удаление из множества ассоциаций с HQL?
Вопрос
А если так, какой синтаксис?
Предположим, я хочу, чтобы экземпляр Foo был не связан со всеми экземплярами Bar: В SQL это будет просто так:
delete from FOO_BAR_MAPPING
where FOO_ID = ?
В HQL я предполагал, что это будет что-то вроде:
delete from Bar.foos foos
where foos.id = :id
(где foos - это сопоставленная коллекция Foo)
Но, похоже, это неправильно, давая:
org.hibernate.hql.ast.QuerySyntaxException: Bar.foos is not mapped
Возможно ли это даже с HQL?
Решение
Чтобы ответить на ваш конкретный вопрос, нет, насколько я знаю, это невозможно с HQL.
Я думаю, что вы немного смешиваете SQL и HQL. В SQL вы действительно " удалите " записи, и, конечно, Hibernate в конечном итоге будет делать это также. Однако Hibernate / HQL разработан с учетом объектно-ориентированного мышления, поэтому " delete " в этом контексте означает, что вы удаляете объекты, а не ассоциации. Обычно вы делаете что-то вроде следующего:
Foo f = session.get(Foo.class, id);
f.getBars().clear();
session.merge(f);
При этом извлекается объект по указанному вами идентификатору и удаляются все ассоциации баров путем очистки его коллекции. Очевидно, что для этого нужно сопоставить ассоциацию Foo-Bars в правильном направлении.
Другие советы
Удаление только ассоциаций с HQL невозможно. Однако вы можете сделать следующее:
A) Предполагая, что вы делаете это для одного Foo, и ваш каскад настроен соответствующим образом, вы можете загрузить этот экземпляр Foo
, очистить его коллекцию bars
и сохранить Это. Р>
B) Если вы пытаетесь очистить bars
от нескольких Foos
, вы можете отобразить SQL-запрос вместо HQL