Привести строку результата в объект - PullRequest
4 голосов
/ 05 января 2010

Есть ли способ привести строку результата, полученную при вызове хранимой процедуры, к конкретному объекту, чтобы я мог передать только список этого объекта в представление?

Я знаю, что могу использовать для этого такие вещи, как Node.list (), но в конце концов я собираюсь заменить getnodes () довольно сложной хранимой процедурой, которая создает временные таблицы и выполняет некоторые оптимизированные sql fu. Но сейчас я просто работаю над взаимодействием Грааля.

Итак, на стороне MySQL у меня есть следующая хранимая процедура:

CREATE DEFINER=`root`@`255.255.255.255` PROCEDURE `getnodes`()
BEGIN
   select * from node;
END

На контроллере Grails у меня есть следующее:

def nodes = new ArrayList<Node>()

// collect all the nodes returned
sql.eachRow("{call getnodes()}") { 
    nodes.add(it as Node)
}

println "Nodes size is: " + nodes.size()
nodes.eachWithIndex { d, i ->
    println "$i : $d"
}

Мой план состоит в том, чтобы затем передать узлы представлению.

Проблема в том, что он взрывается на линии:

nodes.add(it as Node)

Это вообще возможно? Я имею в виду, это должно просто принуждать, верно? Что я делаю не так?

1 Ответ

3 голосов
/ 05 января 2010

Нет, это не должно "просто принуждать". Относительно следующего:

sql.eachRow("{call getnodes()}") { 
    nodes.add(it as Node)
}

Тип it - GroovyRowResult, поэтому it as Node вызовет GroovyRowResult.asType(Node.class)

Так что это принуждение завершится неудачей, если автор этого метода специально не обработает это преобразование. Поскольку преобразование GroovyRowResult в Node довольно неясно, я не думаю, что следует разумно ожидать, что этот случай будет обработан.

Очевидным решением является сделать преобразование самостоятельно:

sql.eachRow("{call getnodes()}") {GroovyRowResult it ->

    Node node = // TODO: Code to convert it to a Node 
    nodes.add(node)
}

Кроме того, вы можете использовать метапрограммирование для переопределения asType метода GroovyRowResult, чтобы он также обрабатывал преобразование в Node.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...