2009-10-25 4 views
0

Groovy GString에서 $ macro를 사용하고 싶습니다. 나는이 코드를 썼다있을 때Groovy GString 문제

['cdata','tdata'].each { def sql = "select * from $it_1" }

내가 오류 알 수없는 속성이 $ it_

확인을 얻을 수있어, 난 다시 해요 그것은

다음

['cdata','tdata'].each { def sql = "select * from ${it}_1" }

내가 해요 GET 결과 문자열에서 원하지 않는 따옴표 - "select * from 'cdata'_1"

질문 나는 $ -macro를 GString에서 achiv로 사용할 수있다. e "select * from cdata_1"결과 문자열? 따옴표는 당신의 IDE에서하지 않으면 내가 설명

+0

이해가되지 않습니까? groovy 셸에서 위의 코드를 실행하면 결과에 따옴표가 표시되지 않습니까? –

+0

흠 ... 곧 - $ it_1 = 오류, $ {it} _1 = 'cdata'_1, 필요합니다 [somewhat] = cdata_1. –

답변

4

Groovy의 SQL 확장 기능을 사용하여 여기에서 도움을 얻을 수 있습니다. 당신이 당신의 G 스트링의 다른 매개 변수가있는 경우이 방법을 사용

['cdata','tdata'].each {table -> def sql = "select * from ${Sql.expand table}_1" } 

특히 중요 : 다음 코드는 트릭을 할 것 준비된 문 위의 예에서

def name = 'Charlie Sheen' 
def tables = ['normalPeople','crazyPeople'] 
tables.each { table -> 
    def sqlString = "select * from ${Sql.expand table} where name = ${name}" 
    /* Execute SQL here */ 
} 

여전히 사용됩니다, 그리고 'name'변수의 내용은 여전히 ​​매개 변수로 처리되므로 (SQL 주입 공격으로부터 사용자를 보호하는 데 도움이 됨) 테이블 변수 매개 변수가 올바르게 확장됩니다.

+0

위대한. 문자열에 GString 변수를 할당하여 해결할 수 있습니다. 어떤면에서이 멋있는 SQL "기능"(자동으로 GString을 쿼리 매개 변수로 대체)이 내 관점에서 매우 불분명합니다. –

0
groovy:000> ['cdata','tdata'].each { def sql = "select * from ${it}_1"; println sql } 
select * from cdata_1 
select * from tdata_1 
===> [cdata, tdata] 

내가 어떤 따옴표를 볼 그나마이 ... 즉, 당신은이 작업을 수행 할 수 있습니다 :

['cdata','tdata'].each { def sql = "select * from ${it.replaceAll("'","")}_1" } 
+0

흠 ... 정말로 ... 매우 이상한 ... 나는 Groovy Plugin과 함께 Eclipse를 사용하고 있으며 Groovy Script로 실행 중이다. 거기에 문제가있을 수 있습니다 ... 나는 그루비 콘솔에서 시도하고있어, 바로, 나는 따옴표를 안. –

1

을 요구했다, 또는 당신이 코드를 평가하고 어떤 이유

+0

Groovy 플러그인으로 Eclipse를 사용하고 있으며 Groovy Script로 실행 중입니다. 거기에 문제가있을 수 있습니다 ...하지만 당신의 솔루션을 시도하고, 너무 우아하지만 작동하지 않습니다. –

0

진짜 대답은 의문의 여지가있어서 미안합니다. 내가 그루비 SQL에 전달 나는 쿼리를 실행하려고 할 때, 실제 쿼리의

"select * from :?_1"; 

이었다

def sql = "select * from ${it}_1"; 

G 스트링 정의했다 후 그래서
그루비 SQL은 G 스트링에서 매개 변수가있는 쿼리를 만드는 이 드라이브는 MSSQL을 미치게 만듭니다.
여러분 모두에게 감사 드리며, 아마도 누군가가 이것을 유용하게 사용하게 될 것입니다.