如果是这样,语法是什么?

假设我希望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是从面向对象的思维模式设计的,因此“删除”在此上下文中意味着您要删除对象,而不是关联。通常你会做以下事情:

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

这将按您指定的ID检索对象,并通过清除其集合来删除所有Bar关联。显然,你必须将Foo-Bars关联映射到正确的方向才能使其工作。

其他提示

使用HQL无法单独删除关联。但是,您可以做的是:

A)假设您正在为单个Foo执行此操作并且您的级联设置正确,您可以加载 Foo 实例,清除其 bars 的集合并保存它。

B)如果你想从多个 Foos 中清除 bars ,你可以映射一个SQL查询而不是HQL

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top