Groovy GString问题

Groovy GString问题,groovy,gstring,Groovy,Gstring,我想在groovy GString中使用$macro。当我写下这段代码时 ['cdata','tdata'],每个{ def sql=“从$it中选择*1” } 我得到错误未知属性$it_ 好的,我正在重写它 ['cdata','tdata'],每个{ def sql=“从${it}\u 1中选择* } 然后我在结果字符串中得到不需要的引号-“从“cdata”中选择*1” 问题是我如何在GString中使用$-macro来获得“select*from cdata\u 1”结果字符串 gr

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


['cdata','tdata'],每个{
def sql=“从$it中选择*1”
}

我得到错误未知属性$it_

好的,我正在重写它


['cdata','tdata'],每个{
def sql=“从${it}\u 1中选择*
}

然后我在结果字符串中得到不需要的引号-“从“cdata”中选择*1”

问题是我如何在GString中使用$-macro来获得“select*from cdata\u 1”结果字符串

groovy:000> ['cdata','tdata'].each { def sql = "select * from ${it}_1"; println sql }
select * from cdata_1
select * from tdata_1
===> [cdata, tdata]
我看不到任何引用。。。这就是我要求澄清的原因


我看不到任何引用。。。这就是我要求澄清的原因

如果引用不是来自您的IDE,或者您在其中评估代码的内容,您可以这样做:

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

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

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

真正的答案在问题背后,所以我很抱歉。
GroovySQL从GString进行参数化查询,所以在我定义GString之后

def sql = "select * from ${it}_1";
我将其传递给GroovySQL,当我尝试执行查询时,实际的查询是

"select * from :?_1";
当然,这会让MSSQL疯狂。

再次感谢大家,也许有人会觉得这很有用。

真正的答案在问题背后,所以我很抱歉。
GroovySQL从GString进行参数化查询,所以在我定义GString之后

def sql = "select * from ${it}_1";
我将其传递给GroovySQL,当我尝试执行查询时,实际的查询是

"select * from :?_1";
当然,这会让MSSQL疯狂。

再次感谢大家,也许有人会发现这很有用。

您可以使用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注入攻击),但表变量参数将正确展开。

您可以使用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注入攻击),但表变量参数将正确展开。

不理解问题?在groovy shell中执行上述代码时,结果中没有引号?嗯。。。很快-$it\U 1=错误,${it}\U 1='cdata'\U 1,需要$[稍微]=cdata\U 1。不明白这个问题吗?在groovy shell中执行上述代码时,结果中没有引号?嗯。。。很快-$it\u 1=error,${it}\u 1='cdata'\u 1,需要$[多少]=cdata\u 1.Hm。。。真正地很奇怪。。。我将Eclipse与Groovy插件一起使用,并作为Groovy脚本运行。可能有问题。。。我正在groovy控制台中尝试,你是对的,我不想被引用。嗯。。。真正地很奇怪。。。我将Eclipse与Groovy插件一起使用,并作为Groovy脚本运行。可能有问题。。。我在groovy控制台中进行了尝试,你说得对,我没有得到引用。我正在使用Eclipse和groovy插件,并作为groovy脚本运行。可能有问题。。。但我正在尝试您的解决方案,虽然不是很优雅,但确实有效。我正在使用Eclipse和Groovy插件,并以Groovy脚本的形式运行。可能有问题。。。但我正在尝试你的解决方案,不那么优雅,但确实有效。太好了。我通过将GString变量赋值给String来解决这个问题。在我看来,GroovySQL的这个“特性”(自动用查询参数替换gstring)无论如何都是不清楚的。太好了。我通过将GString变量赋值给String来解决这个问题。在我看来,GroovySQL的这个“特性”(自动用查询参数替换gstring)无论如何都是不清楚的。