将结果行强制转换为对象

时间:2010-01-04 21:22:53

标签: sql mysql grails groovy

有没有办法强制从调用存储过程到特定对象的结果行,所以我只能将该对象的列表传递给视图?

我知道我可以使用像Node.list()这样的东西来做这件事,但我最终会用一个相当复杂的存储过程替换getnodes()来创建临时表并做一些优化的sql fu。但是现在我只是在处理grails交互。

所以在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 个答案:

答案 0 :(得分:3)

不,它不应该“只是胁迫”。关于以下内容:

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的{​​{1}}方法,以便它也处理到Node的转换。