强制结果行到对象
问题描述:
有没有办法强制调用存储过程得到的结果行到一个特定的对象,所以我可以只将该对象的列表传递到视图?我知道我可以使用像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)
这甚至可能吗?我的意思是这应该只是胁迫吧?我究竟做错了什么?
答
不,它不应该“只是胁迫”。关于下列内容:
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)
}
或者,你可以使用元编程来覆盖的GroovyRowResult
,使得它也处理转换为节点的asType
方法。
我最终只是用Node.get(it.id)查找每个节点, – TheBigS 2010-01-06 11:40:33