使用联接更新值

2022-09-03 18:19:47

使用Hibernate,我想根据条件更新数据库中的数据,但我得到了以下错误:“要遍历的节点不能为空”

这是我的数据库描述:

Account: id, email, password
Member : id, account, team
Team: id, current (and a reference to member => members)

这是我的JPA:

UPDATE Team t SET t.current = :current LEFT JOIN t.members m WHERE t.current = :current_true AND m.account = :account

我做错了什么?如果我将左联接移动到 SET 之前:

UPDATE Team t LEFT JOIN t.members m SET t.current = :current WHERE t.current = :current_true AND m.account = :account

我得到了:“期待SET,找到左派”

如果我删除连接 :

UPDATE Team t SET t.current = :current WHERE t.current = :current_true AND t.members.account = :account

我得到:“非法尝试取消引用集合”。

更新值的正确方法是什么?

感谢您的帮助!


答案 1

使用子查询:

(未测试)

UPDATE Team t SET t.current = :current 
WHERE t.id in (select t1.id from Team t1  LEFT JOIN t1.members m WHERE t1.current = :current_true AND m.account = :account)

答案 2

第 4 章中的 JPA 2.0 规范包含 JPQL 中所有受支持功能的详细信息。这是“更新”语句的定义:

这些操作的语法如下:

update_statement ::= update_clause [where_clause]
 update_clause ::= UPDATE entity_name [[AS] identification_variable] 
                     SET update_item {, update_item}*
  update_item ::= [identification_variable.]{state_field | single_valued_object_field} =
                     new_value 
new_value ::= 
   scalar_expression |
   simple_entity_expression |
   NULL

如您所见,此处未说明对多个实体的支持。我想你必须找到一种不同的方法来做到这一点,也许创建一个方法来选择要首先更新的实体,然后循环访问设置值的结果。或者,您可以使用本机 SQL 更新。


推荐