如何在Grails HQL executeUpdate()中实现限制?
我正在运行Grails1.3.6,我有以下代码:如何在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])
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])