Как прочитать каждую строку в выражении groovy-sql?

Я пытаюсь прочитать таблицу с пятью строками и столбцами. Я использовал функцию sql.eachRow для чтения eachRow и присвоения значения строке. Я получаю сообщение об ошибке "Groovy:[Статическая проверка типа] - Нет такого свойства: MachineName для класса: java.lang.Object"

Мой код:

sql.eachRow('select * from [MACHINES] WHERE UpdateTime > :lastTimeRead, [lastTimeRead: Long.parseLong(lastTimeRead)])
{ row ->
    def read = row.MachineName
}

но MachineName - это имя моего столбца. Как я могу преодолеть эту ошибку.

2 ответа

Решение

Использование динамических свойств со статической проверкой типов невозможно *.

Тем не мение, eachRowпройдет GroovyResultSet в качестве первого параметра Closure, Это означает, что row имеет тип GroovyResultSet и поэтому вы можете получить доступ к значению с помощью getAt

row.getAt('MachineName')

должно сработать. В Groovy вы также можете использовать [] -оператором:

row['MachineName']

что эквивалентно первому решению.

*) без расширения проверки типа.

Если вы знаете имя столбца, вы можете просто использовать ниже.

"$row.MachineName" 

Но если вы не знаете имя столбца или у вас есть какая-то проблема, вы все равно можете получить к нему доступ, используя массив Select.

sql.eachRow('select * from [MACHINES] WHERE UpdateTime > :lastTimeRead, [lastTimeRead: Long.parseLong(lastTimeRead)]) 
{ row->
        log.info "First value = ${row[0]}, next value = ${row[1]}"
}
Другие вопросы по тегам