Обновление JPQL / HSQL с ограничением?

#java #hibernate #jpa #hsqldb

#java #переход в спящий режим #jpa #hsqldb

Вопрос:

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

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

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

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

Ответ №1:

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

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

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

Ответ №2:

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

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

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

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