MySQL交叉连接查询的Hibernate异常

MySQL交叉连接查询的Hibernate异常,mysql,hibernate,Mysql,Hibernate,我正在尝试批量删除一个对象Feature,它与另一个类FeaturesMetadata具有双向多通关系。我正在抛出一个SQLGrammerException 我正在使用的hql: String hql = "delete from Feature F where F.featuresMetadata.stateGeoId = :stateGeoId"; 启用“显示SQL”,将生成以下内容: delete from FEATURE cross join FEATURESMETADATA fea

我正在尝试批量删除一个对象Feature,它与另一个类FeaturesMetadata具有双向多通关系。我正在抛出一个SQLGrammerException

我正在使用的hql:

String hql = "delete from Feature F where F.featuresMetadata.stateGeoId = :stateGeoId";
启用“显示SQL”,将生成以下内容:

 delete from FEATURE cross join FEATURESMETADATA featuresme1_ where STATEGEOID=?
直接在db客户端中运行SQL会出现以下异常:

 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引发异常,我尝试将方言从mysql5innodbdialent更改为mysqlinnodbdialent,但没有更改


有人能帮忙吗?

在这种HQL查询中可能没有联接。引自:

不能在大容量HQL中指定隐式或显式联接 查询子查询可以在where子句中使用,其中 子查询本身可能包含联接

所以我想这样的方法应该行得通:

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

我也有同样的问题,并努力找到一个合理的答案。看起来,即使您使用这种方法,生成的SQL也是非常低效的(根据我所阅读的内容)

因此,我退了一步,做了以下工作:

    List<Properties> props = propDao.findPropertiesByHotelCode(hotel.getCode());
    propDao.deleteInBatch(props);
    propDao.flush();
List props=propDao.findPropertiesByHotelCode(hotel.getCode());
propDao.deleteInBatch(道具);
propDao.flush();
基本上,我是在尝试“删除位置”,我是在选择位置,然后批量删除我检索到的集合


希望这有帮助。

FeaturesMetaData有FK到Feature吗?Feature有FK到FeaturesMetaData.Doh!我已经读了好几遍了,仍然没有点击。回答被接受。您好,我很惊讶它对您有效,因为我得到:org.hibernate.exception.genericjdbception:您不能在FROM子句中指定更新的目标表“Users”。之所以会出现这种情况,是因为您无法修改在“选择零件”中使用的同一个表(在您的示例中为“特征表”)。此行为记录在:。有什么建议吗?哇。我认为HQL是为了使查询比SQL更简单、更面向对象。我不明白为什么Hibernate不能独自找出如何在没有显式连接的情况下将对象之间的关系转换为SQL查询。我不明白这是如何回答主要问题的:在HQL中,他没有进行任何连接…@Phate他正在进行隐式连接,您可以看到Hibernate将查询转换为交叉连接。