簡體   English   中英

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

[英]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()工作得很好。

請參閱: http//groovy.codehaus.org/Tutorial+6+-+Groovy+SQL

我認為問題在於,當您使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM