Исключение гибернации в MySQL Cross Join Query - PullRequest
25 голосов
/ 30 августа 2011

Я пытаюсь выполнить массовое удаление объекта Feature, который имеет двунаправленную связь ManyToOne с другим классом FeaturesMetadata.У меня возникло исключение SQLGrammerException.

hql, который я использую:

String hql = "delete from Feature F where F.featuresMetadata.stateGeoId = :stateGeoId";

При включении шоу SQL генерируется следующее:

 delete from FEATURE cross join FEATURESMETADATA featuresme1_ where STATEGEOID=?

ВыполнениеSQL непосредственно в клиенте db дает следующее исключение:

 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'cross join FEATURESMETADATA featuresme1_ where stategeoid='01'' at line 1

Поскольку сгенерированный SQL вызывает исключение, я попытался изменить диалекты с MySQL5InnoDBDialect на MySQLInnoDBDialect, но без изменений.

Может кто угоднопомочь?

Ответы [ 2 ]

38 голосов
/ 30 августа 2011

Возможно, у вас нет соединений в таком HQL-запросе. Цитата из справочной документации :

В массовом HQL нельзя указывать ни явные, ни явные объединения запрос. Подзапросы могут использоваться в предложении where, где Сами подзапросы могут содержать объединения.

Так что я думаю, что-то вроде этого должно работать:

delete from Feature F where F.id in 
    (select f2.id from Feature f2 where f2.featuresMetadata.stateGeoId = :stateGeoId)
0 голосов
/ 04 апреля 2019

У меня была та же проблема, и я изо всех сил пытался найти разумный ответ.Кажется, что даже если этот подход заработает, сгенерированный SQL будет крайне неэффективным (согласно тому, что я прочитал).

Поэтому я сделал шаг назад и сделал следующее:

    List<Properties> props = propDao.findPropertiesByHotelCode(hotel.getCode());
    propDao.deleteInBatch(props);
    propDao.flush();

В основном, пытаясь «удалить где», я делаю выбор «где», а затем удаляю пакетно полученный набор.

Надеюсь, это поможет.

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