Обновление JPQL / HSQL с лимитом? - PullRequest
2 голосов
/ 08 мая 2011

Я хочу обновить столбец типа @Version в качестве управляемой приложением пессимистической блокировки.

Вот шаги, которые я хочу предпринять:

  1. Получить следующий номер последовательности
  2. Выберите первые 50 записей и обновите столбец в стиле @version, указав номер последовательности.
  3. Теперь выберите обратно те 50 записей, которые соответствуют этой последовательности.

Как можно написать запрос JPQL или HSQL, который обновляет столбец, но ограничивается фиксированным числом записей?

Ответы [ 2 ]

3 голосов
/ 09 мая 2011

Никто не может.На самом деле, такой запрос также нельзя написать на SQL, если только он не работает с СУБД, поддерживающей запись update ... limit X - не все СУБД.

Возможные обходные пути:

  • Выберите первые 50 записей (вы можете использовать limit или, скорее, setMaxResults() здесь) и обновите их одну за другой - в рамках одной и той же транзакции, конечно.
  • Выберите PK из 50-й записи (используяsetMaxResults() и setFirstResult()) и выполните массовое обновление с условием entity.pk <= :pk.Это предполагает, что вы согласны с упорядочением запроса выбора по PK.
0 голосов
/ 12 июля 2015

В последних версиях HSQLDB вы можете:

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

С версией 2.3.3 вы можете:

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