Hibernate HQL обновление с подвыбором в предложении set - PullRequest
4 голосов
/ 19 июля 2010

Я пытаюсь сделать обновление в Hibernate HQL с помощью подвыбора в предложении set, например:

update UserObject set code = (select n.code from SomeUserObject n where n.id = 1000)

Не работает, не поддерживается?

Спасибо

Udo

Ответы [ 2 ]

3 голосов
/ 04 января 2013

У меня была такая же проблема, обнаружил, что вам нужно поместить массовые обновления в сторону транзакции:

tr = session.getTransaction();
tr.begin();
updateQuery.executeUpdate();
tr.commit;
3 голосов
/ 20 июля 2010

Из документации Hibernate:

13,4. Операции в стиле DML

...

псевдосинтаксис для UPDATE и DELETE заявления это: ( UPDATE | DELETE ) FROM? EntityName (WHERE where_conditions)?.

Некоторые моменты, на которые следует обратить внимание:

  • В предложении from ключевое слово FROM необязательно
  • В предложении from может быть только один объект. Оно может, однако, будьте псевдонимом. Если субъект имя псевдоним, то любое свойство ссылки должны быть уточнены с использованием этот псевдоним. Если имя объекта не псевдоним, то это незаконно для любого ссылки на свойства для уточнения.
  • В массиве нельзя указывать ни явные, ни явные объединения HQL-запрос. Подзапросы могут быть использованы в предложении где, где Сами подзапросы могут содержать присоединяется.
  • Предложение where также необязательно.

Хотя в документации явно не упоминается ограничение на заданную часть, можно интерпретировать , что подзапросы поддерживаются только в предложении where. Но ...

Я обнаружил проблему 4 года (вздох) о проблемах массового обновления ( HHH-1658 ), и, по словам репортера, работает следующее:

UPDATE Cat c SET c.weight = (SELECT SUM(f.amount) FROM Food f WHERE f.owner = c)

Интересно, поможет ли использование псевдонима в предложении from. Похоже, в любом случае есть какая-то странность.

...