将结果行强制转换为对象

Posted

技术标签:

【中文标题】将结果行强制转换为对象【英文标题】:Coerce result row into object 【发布时间】:2011-01-01 10:04:46 【问题描述】:

有没有办法将调用存储过程获得的结果行强制转换为特定对象,以便我可以只将该对象的列表传递到视图中?

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

这甚至可能吗?我的意思是这应该只是强迫,对吗?我做错了什么?

【问题讨论】:

我最终只是用 Node.get(it.id) 查找每个节点 【参考方案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)

或者,您可以使用元编程来覆盖 GroovyRowResultasType 方法,这样它也可以处理到 Node.js 的转换。

【讨论】:

以上是关于将结果行强制转换为对象的主要内容,如果未能解决你的问题,请参考以下文章

VBA:只有在公共对象模块中定义的用户定义类型才能被强制转换为变体或从变体强制转换或传递给后期绑定函数

向上强制转换和向下强制转换

无法将类型为“System.DateTime”的对象强制转换为类型“System.String”

C# 自定义 DynamicObject 强制转换为派生对象

java中的强制类型转换

如何将对象强制转换为JsType?