Исключение 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, но никаких изменений.
Может ли кто-нибудь помочь?
Ответы
Ответ 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", а затем удаляю в пакете набор, который я получил.
Надеюсь это поможет.