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