MySQL交叉连接查询的Hibernate异常

时间:2011-08-30 16:29:17

标签: mysql hibernate

我正在尝试批量删除一个对象Feature,它与另一个类FeatureMetadata具有鸟类ManyToOne关系。我抛出了一个SQLGrammerException。

我正在使用的hql:

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

启用show 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抛出Exception,我尝试将方言从MySQL5InnoDBDialect更改为MySQLInnoDBDialect,但没有变化。

有人可以帮忙吗?

3 个答案:

答案 0 :(得分:36)

您可能没有加入此类HQL查询。引自reference documentation

  

可以在批量HQL中指定隐式或显式的连接   查询。子查询可以在where子句中使用,其中   子查询本身可能包含连接。

所以我觉得这样的事情应该有效:

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

答案 1 :(得分:0)

我遇到了同样的问题,努力寻找一个明智的答案。看来,即使您采用这种方法,生成的SQL效率也很低(根据我的阅读)。

所以我退后一步并执行以下操作:

Button

基本上是棕褐色的尝试“删除位置”,我正在选择位置,然后批量删除检索到的集合。

希望这会有所帮助。

答案 2 :(得分:0)

这在 Hibernate 中确实相当糟糕。但是你可以在repo中这样解决它:(至少在PostgreSQL中,不确定是否应该为MySql修改此语法)

@Modifying
@Query(nativeQuery = true, value = """
    DELETE FROM feature f
    USING features_metadata fd
    WHERE f.features_metadata_id = fd.id AND fd.state_geo_id = :stateGeoId
    """)
void deleteByStateGeoIdId(@Param("stateGeoId") UUID stateGeoId);