【问题标题】:Update value with join使用连接更新值
【发布时间】:2015-03-20 23:48:46
【问题描述】:

使用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

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

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

感谢您的帮助!

【问题讨论】:

    标签: java hibernate jpa jpql


    【解决方案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)
    

    【讨论】:

    • 这将相当巧妙地转换为 sql 中的子选择,并且只要键不是复合键就可以工作。
    • 是的!这行得通。该死!我担心了一秒钟。如果有复合嵌入键,这也有效
    • 这不会导致以下错误——“您无法在 FROM 子句中指定目标表 'bid_response' 进行更新”。我收到上述错误,这与报告的一致在stackoverflow.com/questions/4429319/…
    【解决方案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 更新。

    【讨论】:

    • 那么,本地 SQL 更新将是首选,当您可以使用一个查询进行更新时,迭代数据库中的 n 个条目以进行更新是愚蠢的! (奇怪的是 JPA 不包括它?!)
    • @cx42net 即便如此,我认为您的查询不需要加入。为什么你不能只在 Team 实体上编写查询而不使用 members 字段?毕竟你使用的是左连接,所以结果是一样的,不是吗?
    • Member同时加入Team和Account,我需要根据账户过滤更新,所以我想我需要加入Member。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-07
    相关资源
    最近更新 更多