2010-01-04 7 views
4

저장 프로 시저를 호출 한 결과 행을 특정 객체로 강제 변환 할 수 있도록 객체의 목록 만 뷰에 전달할 수 있습니까?객체에 결과 행 강제 변환

Node.list()와 같은 것을 사용할 수 있지만 임시 테이블을 생성하고 최적화 된 SQL fu를 수행하는 상당히 복잡한 저장 프로 시저로 getnodes()를 대체하려고합니다. 그러나 지금은 grails 상호 작용에 대해 노력하고 있습니다. 나는 다음과 같은 한 Grails의 컨트롤러에서

CREATE DEFINER=`root`@`255.255.255.255` PROCEDURE `getnodes`() 
BEGIN 
    select * from node; 
END 

:

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" 
} 

내 계획은 다음 뷰에 노드를 전달하는 것입니다

그래서 MySQL의 측면에서 나는 다음과 같은 저장 프로 시저가 있습니다.

nodes.add(it as Node) 

이도 가능 :

문제는 라인에 불면이다? 이게 바로 권리를 강요해야한다는 뜻인가요? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

Node.get (it.id)로 각 노드를 검색했을뿐입니다. – TheBigS

답변

3

아니요, "그냥 강제로"해서는 안됩니다. 다음에 관하여 :

it의 유형이다 GroovyRowResult
sql.eachRow("{call getnodes()}") { 
    nodes.add(it as Node) 
} 

때문에 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 메소드를 오버라이드 (override) 메타 프로그래밍 사용할 수 있습니다.