具有限制的Grails executeUpdate不适用于删除

时间:2016-04-26 08:12:34

标签: 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])

Pure 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

1 个答案:

答案 0 :(得分:1)

使用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和一个最大值,用于选择ID,然后DELETE用于这些特定ID。
  2. 使用本机查询(例如SQL)为您提供对底层数据库的完全访问权。