Как заставить LIMIT работать в Grails HQL executeUpdate ()? - PullRequest
3 голосов
/ 03 февраля 2011

Я использую 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])

Похоже, этот код обновляет все строки в БД вместо 5 самых старых записей. Означает ли это, что LIMIT не работает в HQL? Пожалуйста, помогите мне, как добиться той же логики SQL в GORM или HQL. По сути, мне нужно выполнить массовое обновление с использованием LIMIT.

Ответы [ 3 ]

3 голосов
/ 19 декабря 2011

что я делаю (Граальс 1.3.7):

ExAus.executeQuery( "select distinct <field> from <controller>", [max: 20, offset: 0] )
0 голосов
/ 20 марта 2014

Я знаю, что пост довольно старый, но вопрос все еще актуален, так как у меня была такая же проблема.

Вместо этого я использовал 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.

0 голосов
/ 03 февраля 2011

Ожидая ответа, я думаю, что нашел обходной путь.Вот оно:

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 запроса.

Не стесняйтесь предлагать другие подходы.Спасибо!

...