【发布时间】:2011-05-08 13:34:53
【问题描述】:
我想将类似@Version 的列更新为应用程序管理的悲观锁。
这些是我想要采取的步骤:
- 获取序列的下一个编号
- 选择前 50 条记录并使用序列号更新类似 @version 的列。
- 现在选择与该序列匹配的 50 条记录。
如何编写 JPQL 或 HSQL 查询来更新列但将自身限制为固定数量的记录?
【问题讨论】:
我想将类似@Version 的列更新为应用程序管理的悲观锁。
这些是我想要采取的步骤:
如何编写 JPQL 或 HSQL 查询来更新列但将自身限制为固定数量的记录?
【问题讨论】:
不能。事实上,除非碰巧使用支持update ... limit X 表示法的 RDBMS,否则不能在 SQL 中编写这样的查询——并非所有 RDBMS 都这样做。
可能的解决方法是:
limit 或更确切地说,setMaxResults())并逐一更新它们 - 当然是在同一个事务中。setMaxResults()和setFirstResult())并使用entity.pk <= :pk条件执行批量更新。这假设您可以按 PK 排序选择查询。【讨论】:
使用最新版本的 HSQLDB,您可以:
UPDATE atable SET ... WHERE ROWNUM() <=50 [AND ...]
使用 2.3.3 版,您可以:
UPDATE atable SET ... WHERE ... LIMIT 50
【讨论】: