Подтвердить что ты не робот

Исключение Hibernate в MySQL Cross Join Query

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

Я использую hql:

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

Включение show 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 бросает Exception, я пытался изменить диалекты из MySQL5InnoDBDialect в MySQLInnoDBDialect, но никаких изменений.

Может ли кто-нибудь помочь?

4b9b3361

Ответ 1

У вас может не быть объединений в таком запросе HQL. Цитата из справочной документации :

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

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

delete from Feature F where F.id in 
    (select f2.id from Feature f2 where f2.featuresMetadata.stateGeoId = :stateGeoId)

Ответ 2

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

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

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

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

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