Groovy GString выпуски - PullRequest
       23

Groovy GString выпуски

0 голосов
/ 25 октября 2009

Я хочу использовать макрос $ в Groovy GString. Когда я написал этот код

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

я получаю сообщение об ошибке неизвестного свойства $ it_

хорошо, я переписываю это

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

тогда я получаю нежелательные кавычки в строке результата - "select * from 'cdata'_1"

Вопрос в том, как я могу использовать $ -macro в GString для получения строки результата «select * from cdata_1»?

Ответы [ 4 ]

4 голосов
/ 23 марта 2011

Вы можете использовать функцию расширения Sql Groovy, чтобы помочь здесь. Следующий код поможет вам:

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

Использование этого метода особенно важно, если у вас есть другие параметры в вашей GString:

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), но параметр табличной переменной будет расширен правильно.

1 голос
/ 25 октября 2009

Если кавычки не из вашей среды IDE, или из того, в чем вы оцениваете свой код, вы можете сделать это:

['cdata','tdata'].each { def sql = "select * from ${it.replaceAll("'","")}_1" } 
0 голосов
/ 25 января 2011

Реальный ответ был за вопросом, поэтому извините.
Groovy SQL делает параметризованный запрос из GString, поэтому после того, как я определил GString

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

Я передал его Groovy SQL, и когда я попытался выполнить запрос, фактический запрос был

"select * from :?_1";

Конечно, это сводит MSSQL с ума.
Спасибо вам всем еще раз, может быть, кто-то найдет это полезным.

0 голосов
/ 25 октября 2009
groovy:000> ['cdata','tdata'].each { def sql = "select * from ${it}_1"; println sql }
select * from cdata_1
select * from tdata_1
===> [cdata, tdata]

Я не вижу кавычек ... вот почему я просил разъяснений

...