2010-01-04 35 views
4

有沒有辦法強制調用存儲過程得到的結果行到一個特定的對象,所以我可以只將該對象的列表傳遞到視圖?我知道我可以使用像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) 

這甚至可能嗎?我的意思是這應該只是脅迫吧?我究竟做錯了什麼?

+0

我最終只是用Node.get(it.id)查找每個節點, – TheBigS 2010-01-06 11:40:33

回答

3

不,它不應該「只是脅迫」。關於下列內容:

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方法。