2011-02-03 4 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 목록을 작성하기 위해 모든 행을 반복하는 것이 매우 느린 것을 볼 때이 방법을보다 효율적으로 만드는 방법이 있어야합니다. 여기에 대한 자세한 내용은 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)을 대신 사용했다.

당신은 사용하여 첫 번째 서비스/컨트롤러 내에서 데이터 소스 개체를 삽입해야합니다

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 쿼리에서 데이터베이스 네이티브 테이블 및 열 이름을 사용하십시오.

관련 문제