使用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
我做错了什么? 如果我将LEFT JOIN移动到SET之前:
UPDATE Team t LEFT JOIN t.members m SET t.current = :current WHERE t.current = :current_true AND m.account = :account
我得到了:“期待SET,发现LEFT”
如果我删除了联接:
UPDATE Team t SET t.current = :current WHERE t.current = :current_true AND t.members.account = :account
我得到了:“非法尝试取消引用收集”。
更新值的正确方法是什么?
感谢您的帮助!
答案 0 :(得分:12)
使用子查询:
(未经测试)
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)
答案 1 :(得分:8)
第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更新。