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,当尝试删除与自身连接的表时的主要内容,如果未能解决你的问题,请参考以下文章