使用Groovy的$ {...}和SQL

时间:2013-05-20 01:11:43

标签: mysql string jdbc groovy

我有一个关于在JDBC SQL查询中使用字符串的问题。这里有两个例子,我希望两者都有效,但它们没有。

工作版......

    tabl  = "Action"
    query = "SHOW FULL COLUMNS FROM `Action`;"  
    println "   "+ query
    dbConnection.eachRow( query ){

错误变体:

    tabl  = "Action"
    query = "SHOW FULL COLUMNS FROM `${tabl}`;"
    println "   "+ query
    dbConnection.eachRow( query ){

错误以SQL语法错误的形式返回。正如您所看到的,语句在文本上是相同的。

输出显示语句,然后显示错误:

   SHOW FULL COLUMNS FROM `Action`;
   May 20, 2013 10:52:01 AM groovy.sql.Sql eachRow
   WARNING: Failed to execute: SHOW FULL COLUMNS FROM `?`; because: 
      Parameter index out of range (1 > number of parameters, which is 0).
   May 20, 2013 10:52:01 AM groovy.sql.Sql eachRow

我认为只是Groovy试图寻找罪魁祸首。当我将文字字符串提供给JDBC连接时,它可以很好地用于'Action'表。

我希望有人可以解释错误并提供修复。

对于那些阅读,我发现此选项为 解决方法

query = "SHOW FULL COLUMNS FROM `"+ tabl.toString() +"`;" 

虽然可能有一个不那么冗长的选项,但使用“+”;对我来说,感觉好像使用$ {tabl}应该有效。

提前致谢,

2 个答案:

答案 0 :(得分:4)

我也碰到了这个。您的解决方法有效,但更简洁的方法是在toString()版本上调用org.codehaus.groovy.runtime.GStringImpl。也就是说,如果您不需要任何准备好的语句功能或执行保护。这是由于Groovy SQL引擎试图将其转换为预准备语句,因为它将原始字符串视为GString。为了防止SQL注入攻击,在使用最终用户可能提供的值时,您会希望这样做。在你的情况和我的情况下,这不是一个问题,所以toString()工作正常。

请参阅: http://groovy.codehaus.org/Tutorial+6+-+Groovy+SQL

答案 1 :(得分:3)

我认为问题在于当你使用in-string变量时会产生与你不使用它时不同的对象类型。一个是String,另一个是GString

例如,请参阅此脚本和输出:

def a = "123"
def b = "abc"+a
def c = "abc${a}"
println b.class
println c.class

>>

class java.lang.String
class org.codehaus.groovy.runtime.GStringImpl

由于某些原因,似乎eachRow函数对此差异很敏感。您正在使用的两个功能是

但是我不明白他们为什么表现得不同......

另一种解决方法是在toString变量上调用query - 将其转换回String

def d = c.toString()
println d.class

>>

class java.lang.String