0

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

['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

4 回答 4

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 注入攻击),但表变量参数将被正确扩展。

于 2011-03-23T00:28:08.923 回答
1

如果引号不是来自您的 IDE,或者您正在评估代码的任何内容,您可以这样做:

['cdata','tdata'].each { def sql = "select * from ${it.replaceAll("'","")}_1" } 
于 2009-10-25T18:23:43.143 回答
0
groovy:000> ['cdata','tdata'].each { def sql = "select * from ${it}_1"; println sql }
select * from cdata_1
select * from tdata_1
===> [cdata, tdata]

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

于 2009-10-25T18:07:30.793 回答
0

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

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

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

"select * from :?_1";

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

于 2011-01-25T08:31:26.340 回答