一尘不染

将结果行强制转换为对象

sql

有没有一种方法可以强制将存储过程调用到特定对象中而得到的结果行,这样我就可以仅将该对象的列表传递到视图中?

我知道我可以使用诸如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)

这有可能吗?我的意思是这应该强制吧?我究竟做错了什么?


阅读 200

收藏
2021-05-30

共1个答案

一尘不染

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

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的转换。

2021-05-30