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