我想用$宏在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 *”的结果字符串?
您可以使用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注入攻击),但表变量参数将被正确地扩大。
如果报价从你的IDE,或任何你评估你的代码都没有,你可以这样做:
['cdata','tdata'].each { def sql = "select * from ${it.replaceAll("'","")}_1" }
groovy:000> ['cdata','tdata'].each { def sql = "select * from ${it}_1"; println sql }
select * from cdata_1
select * from tdata_1
===> [cdata, tdata]
我没有看到任何引号...这就是为什么我要求澄清
真正的答案是问题的背后,所以我很抱歉。
Groovy的SQL使得从GString的参数化查询,所以我定义后的GString
def sql = "select * from ${it}_1";
我把它传递给Groovy的SQL,当我试图执行查询,实际查询是
"select * from :?_1";
五言的驱动这个疯狂的MSSQL。
感谢大家再次,也许有人会觉得这非常有用。