JPA / JPQL - 批量更新

4

我需要对一张表进行批量更新。 举个快速的例子:

 UPDATE Book b SET b.amount = b.amount + 1 WHERE b IN ( :books )

问题在于b.amount可能是NULL值或整数,如果有NULL值,它应该被视为b.amount等于1。
在JPA / JPQL中是否有任何“强制转换”或其他解决此问题的方法,
提前致谢,
问候, P
3个回答

7

您应该能够使用COALESCE

UPDATE Book b SET b.amount = COALESCE(b.amount, 1) + 1 WHERE b IN ( :books ) 

这是JPA特定的还是Hibernate特定的,因为我不想依赖于提供者? - redbull
1
@redbull:它是在JPA 2.0中引入的,在JPA 2.0之前,它是特定于Hibernate的。 - axtavt
谢谢,正是我所需要的,向上! - redbull

1

我会先用单独的查询去修复空值:

UPDATE Book set b.amount = 0 WHERE b.amount IS NULL

同时,确保无法插入null,如果它不是您逻辑上的合法值。例如,使用@Column(nullable=false)


从长远来看,这似乎是更好的方法(我以后会使用它),但现在我没有这种灵活性。 - redbull

0
我使用了以下方法从当前的JPA提供程序获取JDBC连接。
SessionImplementor si = (SessionImplementor) em.unwrap(Session.class);
Connection connection = si.getJdbcConnectionAccess().obtainConnection();
PreparedStatement pstmt = connection.prepareStatement("...");
// Do something
pstmt.addBatch();
pstmt.executeBatch();
si.getJdbcConnectionAccess().releaseConnection(connection);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接