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

wil*_*ill 5 mysql string groovy jdbc

我有一个关于在JDBC SQL查询中使用字符串的问题.这里有两个例子,我希望两者都有效,但事实并非如此.

工作版......

    tabl  = "Action"
    query = "SHOW FULL COLUMNS FROM `Action`;"  
    println "   "+ query
    dbConnection.eachRow( query ){
Run Code Online (Sandbox Code Playgroud)

错误变体:

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

该错误以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
Run Code Online (Sandbox Code Playgroud)

我认为只是Groovy试图寻找罪魁祸首.当我将文字字符串提供给JDBC连接时,它对"Action"表起作用.

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

对于那些阅读,我发现这个选项是一个解决方法:

query = "SHOW FULL COLUMNS FROM `"+ tabl.toString() +"`;" 
Run Code Online (Sandbox Code Playgroud)

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

提前致谢,

syn*_*ync 3

我认为问题在于,当您使用字符串内变量时会产生与不使用它时不同的对象类型。一个是 a String,另一个是 a 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
Run Code Online (Sandbox Code Playgroud)

eachRow由于某种原因,该函数似乎对这种差异很敏感。您正在使用的两个函数是

但我不明白为什么他们会有不同的行为..

另一种解决方法是调用toString变量query- 这会将其强制转换回 a String:

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

>>

class java.lang.String
Run Code Online (Sandbox Code Playgroud)