2011-05-08 65 views
2

我想更新@Version像列作爲應用程序管理的悲觀鎖。帶有限制的JPQL/HSQL更新?

這些是我想要採取的步驟:

  1. 獲取序列
  2. 下一個號碼選擇前50條記錄,並與序列的數量更新柱狀一個@version。
  3. 現在選擇那些與該序列匹配的50條記錄。

如何寫一個JPQL或HSQL查詢更新一列,但限制自己的固定數量的記錄?

回答

3

一個不能。實際上,不能在SQL中編寫這樣的查詢,除非有人正在使用支持update ... limit X表示法的RDBMS - 並非所有RDBMS都這樣做。

可能的解決方法是:

  • 選擇前50條記錄(可以使用limit,或者更確切地說,這裏setMaxResults())和更新逐一 - 在同一事務中,當然。
  • 選擇第50條記錄的PK(同時使用setMaxResults()setFirstResult()),並使用entity.pk <= :pk條件執行批量更新。這假定你可以通過PK來訂購選擇查詢。
0

隨着最新版本的HSQLDB,您可以:

UPDATE atable SET ... WHERE ROWNUM() <=50 [AND ...] 

隨着2.3.3版本中,您可以:

UPDATE atable SET ... WHERE ... LIMIT 50