我想在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”结果字符串?
答案 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变得疯狂 再次感谢大家,也许有人会觉得这很有用。