我正在运行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进行批量更新。
答案 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查询中使用数据库本机表和列名。