如果是这样,语法是什么?
假设我希望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?
答案 0 :(得分:7)
要回答您的具体问题,不,据我所知,HQL是不可能的。
我认为你在这里混合使用SQL和HQL。在SQL中,你确实“删除”了记录,当然hibernate最终也会这样做。但是,Hibernate / HQL是从面向对象的思维模式设计的,因此在此上下文中的“删除”意味着您要删除对象,而不是关联。通常你会做以下事情:
Foo f = session.get(Foo.class, id);
f.getBars().clear();
session.merge(f);
这将按您指定的ID检索对象,并通过清除其集合来删除所有Bar关联。显然,您必须将Foo-Bars关联映射到正确的方向才能使其正常工作。
答案 1 :(得分:1)
使用HQL无法单独删除关联。但是,您可以做的是:
A)假设您正在为单个Foo执行此操作并且您的级联设置正确,您可以加载Foo
实例,清除其bars
的集合并保存它。
B)如果您尝试从多个bars
清除Foos
,则可以映射SQL查询而不是HQL