在Mysql的HQL更新中使用join的替代方法

在Mysql的HQL更新中使用join的替代方法,mysql,hibernate,hql,Mysql,Hibernate,Hql,我是HQL新手,我需要在HQL no mysql查询中进行批量更新 这是我的实体的一个样本 EnityA{ int id, Date date, int criteria1, EntityB b; } EntityB{ int id, status, List<EntityA> aas; } 现在我想更新criteria1=1且其对应的EntityB状态不等于6的所有内容 我只知道hql不支持隐式或显式连接,所以我想到了使用它们。

我是HQL新手,我需要在HQL no mysql查询中进行批量更新

这是我的实体的一个样本

EnityA{
    int id,
    Date date,
    int criteria1,
    EntityB b;
}

EntityB{
   int id,
   status,
   List<EntityA> aas;
}
现在我想更新criteria1=1且其对应的EntityB状态不等于6的所有内容

我只知道hql不支持隐式或显式连接,所以我想到了使用它们。然后我看到了一些关于使用派生表的博客。所以我尝试了这个查询:

    update EntityA A set A.date= :someDate where A.id in 
(select temp.id from (select A1.id from EntityA A1 where A1.criteria=1 
and A1.b.status <> 6) as temp)
但不幸的是,我有一个意外的标记:异常

我猜这是因为HQL也不支持派生表。现在有办法吗。我真的需要检查实体B的状态


谢谢你

你说得对,HQL for DML可以使用子查询,这些可以使用连接。如果您正确地观察您的查询,它可以像这样重写,这应该是有效的:

 update EntityA A set A.date= :someDate where A.id in 
 // (select temp.id from 
 (select A1.id from EntityA A1 where A1.criteria=1 and A1.b.status <> 6) 
 // as temp)
换句话说:

 update EntityA A set A.date= :someDate where A.id in 
 (select A1.id from EntityA A1 where A1.criteria=1 and A1.b.status <> 6) 
... 在批量HQL查询中,不能指定第16.4节“连接语法的形式”(隐式或显式)。子查询可以在where子句中使用,其中子查询本身可能包含联接。
Hi@Radim第二个选项不起作用,因为我们正在使用隐式联接。我试图通过跳出括号来回答第一个问题,但效果不太好。现在我遇到了意外的字符异常。我用我的实体进行了本地测试,它正在使用交叉连接过滤,其中。。。无需转义第二行与第一行相同-刚刚删除的注释行7这与预期一样适用于我更新EntityA A set A.date=:someDate其中A.id从EntityA A1选择A1.id加入A1.b B1其中A1.criteria=1和B1.status 6oh我真的很抱歉..我以为这是转义。但无论如何,我很惊讶它在您的系统中是如何工作的,因为我让您无法指定目标表实体一个错误,这就是为什么我首先尝试派生表的原因。我认为这与MySQL有关,您可能正在使用其他一些数据库oooops。。。不要告诉我这可能是个问题。你是对的,我使用的是MS SQL,但这对HIBRNATE来说应该不是问题。在这种情况下,它确实是跨平台的。试试我上面的版本-加入。这样行吗?