HQL - обновить поле и вернуть полученное значение в одном запросе - PullRequest
3 голосов
/ 21 апреля 2011

У меня есть таблица, которая будет состоять из столбцов целых чисел, каждый из которых по сути является последовательностью. Каждая строка представляет одну учетную запись клиента и связанные с ней последовательности.

Я пытаюсь найти эффективный способ обновить значение определенной последовательности на переменную величину, а затем получить это обновленное значение, все в одном запросе HQL. Я использую Hibernate 3.6.1 и Spring 3.0.5. База данных Postgres.

Я могу делать то, что хочу, с помощью собственного SQL-запроса следующим образом:

update account.sequences set seq1 = seq1 + :seqIncrement where account_id = :accountId returning seq1;

Однако я бы предпочел использовать существующие имена / поля сущностей, а не имена таблиц. Чем меньше мест для обновления поменялось, тем лучше.

Я не использую последовательности, так как в итоге я имею дело с тысячами из них, и это никогда не будет прямой операцией приращения на одну. Я планирую обновить значение, чтобы охватить количество элементов, для которых мне нужны уникальные идентификаторы. Делая это в одном выражении, мне не нужно беспокоиться о проблемах с блокировкой таблиц или параллелизмом.

Так ... у кого-нибудь есть более чистый способ сделать это? Или я просто слишком обдумываю что-то, что уже могу сделать?

1 Ответ

2 голосов
/ 21 апреля 2011

На самом деле в HQL нет ничего, что могло бы заменить возвращающее предложение в SQL. Выполнение операторов UPDATE в запросе в Hibernate обычно избегается. Он разбивает кэши, изменяет поля сущностей без изменения номера версии, хранит состояние памяти в вашей сессии и, как правило, плохо работает. Обычно в hibernate-приложении вы бы использовали запрос на обновление только для больших пакетных операций, когда последствия использования Session для производительности слишком велики.

Если вы делаете это с достаточно высокой частотой, чтобы блокировка сущности перед обновлением была проблемой, возможно, лучшим вариантом будет собственный sql. Лично я не буду беспокоиться об этом, пока это не станет проблемой. На самом деле вы не выполняете слишком много дополнительной работы с курсором БД, чтобы выбрать для обновления то, что собираетесь обновить, но я также не эксперт Postgres.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...