【发布时间】:2012-06-01 03:04:06
【问题描述】:
我正在尝试使用 Java 持久性查询语言对 DB2 表进行批量更新:
UPDATE Account a
SET a.Status = 'r', a.Code = :code, a.Timestamp = CURRENT_TIMESTAMP
WHERE ClientNumber IN (SELECT ClientNumber FROM Account
WHERE a.Status = '' AND a.Type = :type
ORDER BY a.Code ASC
FETCH FIRST 5 ROWS ONLY)
但是,JPQL 似乎不支持 FETCH FIRST n ROWS ONLY。
还有哪些其他选择可以做到这一点?
【问题讨论】:
-
您遇到的错误是什么?对于大型机 DB2,子查询中的
FETCH FIRST仅在 9.1 之后才存在(但如果您使用的是比这更早的东西,那么您现在已经不再支持了),我相信它已经存在于 Linux/Unix 中/Windows 现在有一段时间了。我看到的一个快速错误是您在:code之后、a.Timestamp之前缺少一个逗号 -
@galador 它肯定受数据库支持...我得到的错误是 org.apache.openjpa.persistence.ArgumentException 带有保留字列表
-
正如@JBNizet 提到的,你的
ORDER BY子句在哪里?即使这可行,您实际上也得到了 5 个 随机 行,这不是您想要的。请记住,SQL 本质上是无序的,你必须告诉它你想要什么。实际上,子查询中的条件应该包含在主WHERE子句中,以防止更新幻像行(取决于锁定级别)。另外,如果您只更新 5 行,这怎么是“批量更新”?如果您因为事务而批处理,请使用更大的行数。 -
@X-Zero 5 rows 只是一个简单的例子,我实际上需要随机帐户
-
获取随机行是一个完全不同的用例。一方面,您不会获得足够随机的行(因为它们将根据某些索引进行排序,通常您只是无法选择哪一个)。生成一些随机的
ClientNumbers 应用程序端,并在它们上运行更新。