如何使LIMIT在Grails HQL executeUpdate()中工作?

时间:2011-02-03 10:24:47

标签: grails hql gorm

我正在运行grails 1.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])

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

3 个答案:

答案 0 :(得分:3)

我做什么(grails 1.3.7):

ExAus.executeQuery( "select distinct <field> from <controller>", [max: 20, offset: 0] )

答案 1 :(得分:0)

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

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}])

我相信这种方法仍然可以被视为与原始方法相同的逻辑。但是,这必须进行2次查询。

随意提出其他方法。谢谢!

答案 2 :(得分:0)

我知道这个帖子已经很老了,但问题仍然存在,因为我遇到了同样的问题。

我又回到了使用Groovy sql(jdbc)。

您需要首先使用以下命令在服务/控制器中注入dataSource对象:

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查询中使用数据库本机表和列名。