【发布时间】:2011-07-07 21:37:00
【问题描述】:
我必须对表执行批量更新。 做一个快速的例子:
UPDATE Book b SET b.amount = b.amount + 1 WHERE b IN ( :books )
问题在于 b.amount 可以是 NULL 值或 int,如果存在 NULL 值,它应该表现为 b.amount 等于 1。
在 JPA/JPQL 中是否有任何“强制转换”或任何其他解决此问题的方法,
提前谢谢你,
问候, P
【问题讨论】:
我必须对表执行批量更新。 做一个快速的例子:
UPDATE Book b SET b.amount = b.amount + 1 WHERE b IN ( :books )
问题在于 b.amount 可以是 NULL 值或 int,如果存在 NULL 值,它应该表现为 b.amount 等于 1。
在 JPA/JPQL 中是否有任何“强制转换”或任何其他解决此问题的方法,
提前谢谢你,
问候, P
【问题讨论】:
你应该可以使用COALESCE:
UPDATE Book b SET b.amount = COALESCE(b.amount, 1) + 1 WHERE b IN ( :books )
【讨论】:
我会先用一个单独的查询来修复空值:
UPDATE Book set b.amount = 0 WHERE b.amount IS NULL
如果null 不是您的逻辑的合法值,则也无法插入。例如有它@Column(nullable=false)
【讨论】:
我使用以下方式从当前的 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);
【讨论】: