[英]Using Groovy's ${…} with SQL
我有一個關於在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}應該有效。
提前致謝,
我也碰到了這個。 您的解決方法有效,但更org.codehaus.groovy.runtime.GStringImpl
方法是在org.codehaus.groovy.runtime.GStringImpl
版本上調用toString()
。 也就是說,如果您不需要任何准備好的語句功能或執行保護。 這是由於Groovy SQL引擎試圖將其轉換為預准備語句,因為它將原始字符串視為GString
。 為了防止SQL注入攻擊,在使用最終用戶可能提供的值時,您會希望這樣做。 在你的情況和我的不是一個問題,所以toString()
工作得很好。
我認為問題在於,當您使用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
函數由於某種原因對這種差異很敏感。 你正在使用的兩個功能是
但我不明白為什么他們的行為會有所不同......
另一種解決方法是在query
變量上調用toString
- 將其轉換回String
:
def d = c.toString()
println d.class
>>
class java.lang.String
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.