JPA更新多行和多个表

时间:2011-11-08 03:04:05

标签: hibernate jpa sql-update

我需要更新表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语法异常......还有其他方法可以实现吗?

感谢。

2 个答案:

答案 0 :(得分:2)

我觉得你尝试竞争错误的东西。命名查询应该是JPQL(HQL)查询,但看起来您正在尝试SQL查询。

因此,想要使用本机查询,那么您应该使用@NamedNativeQuery。如果不是,则需要将查询转换为JPQL(HQL)

*对于JPQL和HQL之间的差异,请查看注释。

Btw JPQL基于Hibernate查询语言(HQL),这是Hibernate对象关系映射库中包含的早期非标准查询语言。

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

答案 1 :(得分: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