【问题标题】:JPA updating multiple rows and tablesJPA 更新多个行和表
【发布时间】:2011-12-24 03:11:35
【问题描述】:

我需要更新表 a 中的多行,通过使用 for 循环并进行合并来使用面向对象的方法似乎没问题。

...
// get list and assign columns to be updated
...
for (MyEntity e : entityList) {
   em.merge(e);
}
..

这种方法还使我能够更新其他表(作为其他属性 pf MyEntity)。 在此处发布的一个问题 updating multiple rows using JPA 上,使用 namedQuery 进行更新的第二个选项似乎更快。但是,如果我还需要批量更新多个表,更新将如何实现?

我试过了:

@NamedQuery(name="Agent.updateAccountStatusByTree",
        query="UPDATE com.sample.core.data.Agent a "
            + "INNER JOIN com.sample.core.data.Player p "
            + "ON a.player.id = p.id "
            + "SET a.accountStatus=:accountStatus, p.status=:accountStatus "
            + "WHERE a.site.id=:siteId and a.agentTree like :agentTree")})

但是这会引发:

org.hibernate.hql.ast.QuerySyntaxException: expecting "set", found 'INNER'

我尝试的另一个选项是:

 @NamedQuery(name="Agent.updateAccountStatusByTree",
        query="update com.sample.core.data.Agent a "
            + "set a.accountStatus=:accountStatus, a.player.status=:playerStatus "
            + "where a.site.id=:siteId and a.agentTree like :agentTree")})

因为我已经有一个对另一个表的引用,但是这会产生一个无效的查询,抛出一个 sql 语法异常......还有其他方法可以实现吗?

谢谢。

【问题讨论】:

    标签: hibernate jpa sql-update


    【解决方案1】:

    JPA 规范声明

    update_clause ::= UPDATE entity_name [[AS] identification_variable]
    SET update_item {, update_item}*
    update_item ::= [identification_variable]{state_field | single_valued_object_field
    

    因此您不能在 UPDATE 语句中加入。使用 JOIN 进行更新的唯一方法是在 SQL 中,然后您会失去数据存储独立性,因为并非所有 RDBMS 都以相同的方式支持 JOIN

    【讨论】:

      【解决方案2】:

      我让他觉得你尝试比赛是错误的。命名查询应该是 JPQL (HQL) 查询,但看起来您正在尝试 SQL 查询。

      所以想要使用原生查询,那么你应该使用@NamedNativeQuery 来代替。如果不是,您需要将查询转换为 JPQL (HQL)

      *关于 JPQL 和 HQL 之间的差异,请查看 cmets。

      顺便说一句,JPQL 基于 Hibernate 查询语言 (HQL),这是一种早期的非标准查询语言,包含在 Hibernate 对象-关系映射库中。

      Hibernate 和 HQL 是在 JPA 规范之前创建的。从 Hibernate 3 开始,JPQL 是 HQL 的子集。 (维基百科)*

      【讨论】:

      • @DataNucleus:这个问题是关于休眠未知版本的。 Hibernate 支持 Hibernate 支持 @NamedQuery@NamedNativeQuery 至少从 Hibernate core 3.2 + Hibernate Annotations 3.3 开始。在这个时候,它显然是 HQL,而不是 JPQL。但这是很久以前的事了,所以我更新了我的答案。
      • @DataNucleus:你为什么要删除你的评论,至少这是一个很好的评论。
      • 抱歉拉尔夫,你回复得太快了 ;-) 我打算改写我的,但到那时你已经回复了,也让你的帖子更清晰了。
      • 感谢您的输入。我最终使用了本机查询。此外,如果要使用基于注解的 namednativequery,hibernate 中似乎仍然存在错误。所以我的最终解决方案是手动构建查询字符串并调用 em.createNativeQuery...agein 谢谢!
      猜你喜欢
      • 2011-05-03
      • 2017-02-05
      • 2017-06-15
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      • 2013-01-15
      • 2018-08-24
      相关资源
      最近更新 更多