Groovy GString问题

时间:2009-10-25 15:57:12

标签: groovy gstring

我想在groovy GString中使用$ macro。当我写这段代码时

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

我得到错误未知属性$ it _

好吧,我重写了它

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

然后我在结果字符串中得到不需要的引号 - “select * from'cdata'_1”

问题是我如何在GString中使用$ -macro来实现“select * from cdata_1”结果字符串?

4 个答案:

答案 0 :(得分:4)

您可以使用Groovy的Sql扩展功能来提供帮助。以下代码将起到作用:

['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 :(得分:1)

如果引号不是来自您的IDE,或者您正在评估代码的任何内容,则可以执行以下操作:

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

答案 2 :(得分:0)

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

我没有看到任何引号......这就是我要求澄清的原因

答案 3 :(得分:0)

这个问题背后是真正的答案,所以我很抱歉 Groovy SQL从GString进行参数化查询,所以在我定义了GString

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

我将它传递给Groovy SQL,当我尝试执行查询时,实际的查询是

"select * from :?_1";

这会让MSSQL变得疯狂 再次感谢大家,也许有人会觉得这很有用。