Возможно ли массовое удаление из множества ассоциаций с HQL?

StackOverflow https://stackoverflow.com/questions/1201690

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top