2011-02-03 50 views
2

我運行的Grails 1.3.6,我有這樣的代碼:如何使限制在Grails HQL executeUpdate()中工作?

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個最早的條目。這是否意味着LIMIT在HQL中不起作用?請幫助我如何在GORM或HQL中實現相同的SQL邏輯。基本上,我需要使用LIMIT進行批量更新。

回答

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個查詢。

隨意建議其他方法。謝謝!

+0

我認爲限制僅限於選擇。我認爲你的解決方法是唯一的方法。但是應該有一種方法來提高效率,因爲我認爲遍歷所有行非常緩慢,只是爲了編寫id列表。有關hql的更多信息,請訪問http://grails.asia/grails-tutorial-for-beginners-hql-queries – JavaDev 2015-02-11 06:18:38

3

我做什麼(1.3.7的Grails):

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

我知道後很舊,但問題仍然是相關的,因爲我有同樣的問題。

我又回到了使用Groovy sql(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查詢中使用數據庫本機表和列名稱。