#java #hibernate #jpa #hsqldb
#java #переход в спящий режим #jpa #hsqldb
Вопрос:
Я хочу обновить столбец @Version like в качестве пессимистической блокировки, управляемой приложением.
Это шаги, которые я хочу предпринять:
- Получаем следующий номер последовательности
- Выберите первые 50 записей и обновите столбец @version like номером последовательности.
- Теперь выберите обратно те 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