有没有办法将调用存储过程获得的结果行强制转换为特定对象,以便我可以仅将该对象的列表传递到视图中?
我知道我可以使用 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)
}
或者,您可以使用元编程来覆盖asType
的方法GroovyRowResult
这样它还可以处理到 Node.js 的转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)