Возможно ли массовое удаление из множества ассоциаций с HQL? - PullRequest
8 голосов
/ 29 июля 2009

А если так, какой синтаксис?

Предположим, я хочу, чтобы экземпляр 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?

Ответы [ 2 ]

7 голосов
/ 29 июля 2009

Чтобы ответить на ваш конкретный вопрос, нет, насколько я знаю, это невозможно с HQL.

Я думаю, что вы немного смешиваете SQL и HQL. В SQL вы действительно «удаляете» записи, и, конечно, hibernate в конечном итоге сделает то же самое. Однако Hibernate / HQL разработан с учетом объектно-ориентированного мышления, поэтому «удаление» в этом контексте означает, что вы удаляете объекты, а не ассоциации. Обычно вы делаете что-то вроде следующего:

Foo f = session.get(Foo.class, id);
f.getBars().clear();
session.merge(f);

Это извлекает объект по указанному вами идентификатору и удаляет все ассоциации баров, очищая его коллекцию. Очевидно, что для того, чтобы это работало, необходимо сопоставить ассоциацию Foo-Bars в правильном направлении.

1 голос
/ 29 июля 2009

Удаление только ассоциаций с HQL невозможно. Однако вы можете сделать следующее:

A) Предполагая, что вы делаете это для одного Foo, и ваш каскад настроен соответствующим образом, вы можете загрузить этот экземпляр Foo, очистить его коллекцию bars и сохранить его.

B) Если вы пытаетесь очистить bars от нескольких Foos, вы можете отобразить SQL-запрос вместо HQL

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...