2011-02-03 7 views
2

私はGrailsの1.3.6を実行していると私はこのコードを持っている:Grails HQL executeUpdate()でLIMITを動作させるには?

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

誰かが返信するのを待っているうちに、回避策が見つかったと思います。ここにあります:

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-html-queries – JavaDev

3

私は何をすべきか(1.3.7をGrailsの):

ExAus.executeQuery("select distinct <field> from <controller>", [max: 20, offset: 0]) 
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クエリのデータベースネイティブテーブルとカラム名を使用します。

関連する問題