Проблемы с обновлением с использованием подзапроса (соединение с той же таблицей) с использованием HQL через базу данных MySQL.

#java #mysql #sql #hibernate #hql

#java #mysql #sql #спящий режим #hql

Вопрос:

Я пытаюсь получить то, что должно быть простым обновлением для настройки для работы в режиме гибернации (с использованием HQL) через базу данных MySQL. Существуют и другие темы, касающиеся ошибок, подобных тем, с которыми я столкнулся, но ничего, что говорит о той же самой проблеме.

Обновление, которое я пытаюсь сделать, — это обновить строку информацией из другой строки в той же таблице. Здесь ничего особенного, и у меня есть аналогичная версия, работающая в MySQL с использованием Toad.

Насколько я понимаю, HQL не любит внутренние соединения для обновлений и вместо этого должен использоваться подзапрос — я правильно понимаю?

В любом случае, ниже приведена первая версия обновления, с которым я работал. Это выдало сообщение об ошибке «Недопустимый путь: ‘tbB.column1′» и, глядя на приведенное ниже, я не уверен, в чем проблема.

 UPDATE tableA tbA
   SET tbA.column1 = tbB.column1
     WHERE tbA.operationalId =
          (SELECT tbB.operationalId FROM tableA AS tbB
            WHERE tbA.operationalId = tbB.operationalId)
   AND tbA.column2 = 1
 

Продолжая исследовать эту проблему, я заменил приведенный выше оператор ‘set’ прямым
присвоением значения tbA.column1 и столкнулся с другой ошибкой, которая указана ниже.

ошибка = «Вы не можете указать целевую таблицу ‘TableA’ для обновления в предложении FROM»

 UPDATE tableA tbA
   SET tbA.column1 = 1
     WHERE tbA.operationalId =
          (SELECT tbB.operationalId FROM tableA AS tbB
            WHERE tbA.operationalId = tbB.operationalId)
   AND tbA.column2 = 1
 

Если кто-нибудь может указать мне правильное направление, которое было бы оценено — я не уверен, нужно ли дополнительно настраивать sql для успешного запуска в режиме гибернации.

Заранее благодарю.

Ответ №1:

MySQL поддерживает join update . Я не уверен, работает ли hibernate:

 UPDATE tableA tbA join
       tableA tblB
       on tbA.operationalId = tbB.operationalId
   SET tbA.column1 = tbB.column1
   WHERE tbA.column2 = 1;
 

Комментарии:

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