我正在尝试批量删除一个对象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,但没有变化。
有人可以帮忙吗?
答案 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);