sql - 带有限制的 Grails executeUpdate 不适用于删除

标签 sql grails hql

我正尝试在 Grails HQL 中做类似的事情,但它不起作用

我想从可能包含 10 个元素的 ID 列表中删除最多 5 个元素。我按日期排序,只删除最旧的 5 个

Entity.executeUpdate(
        "DELETE FROM Entity WHERE id in (:list) ORDER BY date LIMIT 5",
        [list: oldestIdsForRemoval])

纯 SQL 工作得很好

DELETE FROM entity WHERE id in ('8f027db299354a869af51e1f0a60ede1', '96df61161c32491f8aa4a14c5017852c', '88aa7b2bb6e1444f8d892fff10b8adcd') ORDER BY date ASC LIMIT 1

这可能吗? 我也尝试过将 max:5 参数添加到参数列表中,但它失败了。

我正在使用 Grails 1.3.6 。如果它在较新的版本中得到修复,那将是一件好事,尽管我不能使用它。 文档在这方面帮助不大:http://grails.github.io/grails-doc/1.3.7/ref/Domain%20Classes/executeUpdate.html

最佳答案

使用 HQL 时,请考虑使用 Hibernate 的用户指南。它包含一个关于 HQL 的部分,很好地涵盖了该语言。这是根目录:https://docs.jboss.org/hibernate/orm/

另一个来源,虽然更神秘,是用于解析 HQL 代码的解析器的 ANTLR 源:https://github.com/hibernate/hibernate-orm/blob/master/hibernate-core/src/main/antlr/hql.g

根据 ANTLR 代码,您可能会像我一样得出结论,即 HQL 不支持 LIMIT。在这种情况下,您有两种选择:

  1. 使用两个查询。 SELECT 和 max 以选择 ID,然后为这些特定 ID 执行 DELETE
  2. 改用 native 查询(例如 SQL),让您可以完全访问底层数据库。

关于sql - 带有限制的 Grails executeUpdate 不适用于删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36859046/

相关文章:

grails - Quartz在Grails4中不起作用,依赖项中的问题无法编译

grails - GORM 数据服务 VS Grails 服务

mysql - 相当于 HQL 中的 GREATEST()

sql - 应用左连接之前过滤表

sql - SQL 查询参数化如何工作?

sql - 如何获得“不存在”查询的最大值

grails - HSQL数据库管理器不在Grails 2.0中出现

mysql - 查询以检索总和大于其余列的前 2 列

mysql - 使用 CAST() 将 SQL 查询转换为 HQL

java - Hibernate OneToMany SELECT 在实体映射中给出重复列