如何在Grails HQL executeUpdate()中实现限制?

如何在Grails HQL executeUpdate()中实现限制?,grails,hql,gorm,Grails,Hql,Gorm,我正在运行Grails1.3.6,我有以下代码: String hql = ''' UPDATE ApiResponse a SET a.lockId = :lockId WHERE a.lockId = 0 ORDER BY a.dateAdded asc LIMIT 5 ''' ApiResponse.executeUpdate(hql, [lockId : workerId])

我正在运行Grails1.3.6,我有以下代码:

String hql = '''
    UPDATE
        ApiResponse a
    SET
        a.lockId = :lockId
    WHERE
        a.lockId = 0
    ORDER BY
        a.dateAdded asc
    LIMIT 5
    '''
ApiResponse.executeUpdate(hql, [lockId : workerId])

这段代码似乎更新了数据库中的所有行,而不是最早的5个条目。这是否意味着限制在HQL中不起作用?请帮助我如何在GORM或HQL中实现相同的SQL逻辑。基本上,我需要使用LIMIT进行批量更新。

在等待别人回复时,我想我找到了一个解决方法。这是:

def c = ApiResponse.createCriteria()
def targetList = c.list {
    eq('lockId', 0)
    maxResults(5)
    order("dateAdded", 'asc')
}

String hql = '''
    UPDATE
        ApiResponse
    SET
        lockId = :lockId
    WHERE
        id in (:ids)
'''
ApiResponse.executeUpdate(hql, [lockId : workerId, ids: targetList.collect {it.id}])
我相信这种做法仍然可以被视为与原来的逻辑相同。但是,这必须进行两次查询

请随意建议其他方法。谢谢

我所做的(grails 1.3.7):

ExAus.executeQuery(“选择不同于”,[max:20,offset:0])

我知道这篇文章很老了,但这个问题仍然相关,因为我也有同样的问题

我转而使用GroovySQL(jdbc)

首先,您需要使用以下方法在服务/控制器中注入数据源对象:

def dataSource
然后,您可以在您的方法中执行此操作:

String sqlQuery = '''
UPDATE
    API_RESPONSE a
SET
    a.LOCK_ID = :lockId
WHERE
    a.LOCK_ID = 0
ORDER BY
    a.DATE_ADDED asc
LIMIT 5
'''
def sql = new Sql(dataSource)
sql.executeUpdate(sqlQuery, [lockId : workerId])

请注意,您需要在sql查询中使用数据库本机表名和列名。

我认为限制仅适用于选择。我认为你的变通办法是唯一的办法。但是应该有一种方法可以提高效率,因为我认为仅仅为了组成ID列表而迭代所有行的速度非常慢。在这里查看有关hql的更多信息
String sqlQuery = '''
UPDATE
    API_RESPONSE a
SET
    a.LOCK_ID = :lockId
WHERE
    a.LOCK_ID = 0
ORDER BY
    a.DATE_ADDED asc
LIMIT 5
'''
def sql = new Sql(dataSource)
sql.executeUpdate(sqlQuery, [lockId : workerId])