Groovy中的GString问题(Groovy GString issues)

2019-09-01 03:36发布

我想用$宏在Groovy的GString。 当我写了这个代码

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

我我得到错误未知属性$ it_

好吧,我把它改写

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

那么我得到的结果字符串不需要引号 - “从“cdata'_1" 选择*

问题是我如何可以使用$ -macro中的GString才达到“选择cdata_1 *”的结果字符串?

Answer 1:

您可以使用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 */
}

在上面的一份声明中的例子将仍然可以使用,并且“名字”变量的内容将仍然作为一个参数进行处理(从而帮助保护您免受SQL注入攻击),但表变量参数将被正确地扩大。



Answer 2:

如果报价从你的IDE,或任何你评估你的代码都没有,你可以这样做:

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


Answer 3:

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

我没有看到任何引号...这就是为什么我要求澄清



Answer 4:

真正的答案是问题的背后,所以我很抱歉。
Groovy的SQL使得从GString的参数化查询,所以我定义后的GString

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

我把它传递给Groovy的SQL,当我试图执行查询,实际查询是

"select * from :?_1";

五言的驱动这个疯狂的MSSQL。
感谢大家再次,也许有人会觉得这非常有用。



文章来源: Groovy GString issues