【问题标题】: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) 查找每个节点

标签: sql mysql grails groovy


【解决方案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 的转换。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 2014-01-16
    • 2020-04-23
    • 2013-01-22
    • 2019-01-24
    • 2019-12-29
    • 2012-05-31
    相关资源
    最近更新 更多