org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:FROM,当尝试删除与自身连接的表时
Posted
技术标签:
【中文标题】org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:FROM,当尝试删除与自身连接的表时【英文标题】:org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: FROM, when trying to delete table that is joined with itself 【发布时间】:2020-11-24 14:20:06 【问题描述】:我正在尝试使用休眠运行查询 我通过以下方法做到这一点:
private void insertQuery(String toDeleteNewOrOld)
String queryString = "";
if("deleteNew".equals(toDeleteNewOrOld))
queryString =
" delete dmpg2 \n"
+ "from DmPriceGroup dmpg1 \n"
+ " join DmPriceGroup dmpg2 on dmpg1.priceGroupId = dmpg2.priceGroupId \n"
+ " where dmpg1.uid <> dmpg2.uid \n"
+ " and dmpg1.priceGroupName <> dmpg2.priceGroupName \n"
+ " and dmpg1.dmCreateTime > dmpg2.dmCreateTime";
else if("deleteOld".equals(toDeleteNewOrOld))
queryString =
"DELETE dmpg1\n"
+ "FROM DmPriceGroup dmpg1\n"
+ "join DmPriceGroup dmpg2 on dmpg1.priceGroupId = dmpg2.priceGroupId\n"
+ "where dmpg1.uid <> dmpg2.uid\n"
+ "and dmpg1.priceGroupName = dmpg2.priceGroupName\n"
+ "and dmpg1.dmCreateTime > dmpg2.dmCreateTime\n";
Map<String, Object> parameters = new HashMap<>();
writerLogic.executeQuery(getDmEntityClass(), queryString, parameters);
当我执行它时,使用了 deleteold 条件查询字符串,但它失败并出现以下错误
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: FROM near line 2, column 1 [DELETE dmpg1
FROM com.schantz.generallife.dm.model.DmPriceGroup dmpg1
join com.schantz.generallife.dm.model.DmPriceGroup dmpg2 on dmpg1.priceGroupId = dmpg2.priceGroupId
where dmpg1.uid <> dmpg2.uid
and dmpg1.priceGroupName = dmpg2.priceGroupName
and dmpg1.dmCreateTime > dmpg2.dmCreateTime
]
查看类似的问题,这似乎是由语法错误引起的,但是当我在 ssms 上手动运行以下代码时,它运行良好
DELETE dmpg1
FROM DmPriceGroup dmpg1
join DmPriceGroup dmpg2 on dmpg1.priceGroupId = dmpg2.priceGroupId
where dmpg1.uid <> dmpg2.uid
and dmpg1.priceGroupName = dmpg2.priceGroupName
and dmpg1.dmCreateTime > dmpg2.dmCreateTime
在 DELETE 之后删除 dmpg1,将使意外令牌“加入”。但是,我不相信我可以从 DmPriceGroup 中删除而不澄清加入 DmPriceGroup 的删除
【问题讨论】:
您使用的是哪个 dbms? SSMS 当我手动检查查询时,但我的问题是关于休眠 jpa 查询 从删除子句中删除别名并使用子查询 【参考方案1】:根据this 来源,这是不可能的。
您可以取而代之的是获取所有 id,可以在它们上运行 deleteAll()(或者可能编写本机 SQL,但我不喜欢那样)。
【讨论】:
以上是关于org.hibernate.hql.internal.ast.QuerySyntaxException:意外令牌:FROM,当尝试删除与自身连接的表时的主要内容,如果未能解决你的问题,请参考以下文章