0

groovyGStringで$マクロを使用したい。私がこのコードを書いたとき

['cdata','tdata'].each { def sql = "select * from $it_1" }

不明なプロパティ$it_でエラーが発生します

わかりました、書き直します

['cdata','tdata'].each { def sql = "select * from ${it}_1" }

次に、結果文字列に不要な引用符が表示されます-"select * from'cdata'_1"

質問は、GStringで$ -macroを使用して、「select *fromcdata_1」の結果文字列を取得する方法です。

4

4 に答える 4

4

ここでは、GroovyのSQL展開機能を使用できます。次のコードでうまくいきます。

['cdata','tdata'].each {table -> def sql = "select * from ${Sql.expand table}_1" }

このメソッドを使用することは、GStringに他のパラメーターがある場合に特に重要です。

def name = 'Charlie Sheen'
def tables = ['normalPeople','crazyPeople']
tables.each { table -> 
    def sqlString = "select * from ${Sql.expand table} where name = ${name}"
    /* Execute SQL here */
}

上記の例では、プリペアドステートメントが引き続き使用され、「name」変数の内容は引き続きパラメーターとして処理されます(したがって、SQLインジェクション攻撃から保護するのに役立ちます)が、テーブル変数パラメーターは正しく展開されます。

于 2011-03-23T00:28:08.923 に答える
1

引用符がIDEからのものではない場合、またはコードを評価しているものが何であれ、これを行うことができます。

['cdata','tdata'].each { def sql = "select * from ${it.replaceAll("'","")}_1" } 
于 2009-10-25T18:23:43.143 に答える
0
groovy:000> ['cdata','tdata'].each { def sql = "select * from ${it}_1"; println sql }
select * from cdata_1
select * from tdata_1
===> [cdata, tdata]

I dont see any quotes... that is why I was asking for clarification

于 2009-10-25T18:07:30.793 に答える
0

本当の答えが質問の裏にあったので、ごめんなさい。
Groovy SQLはGStringからパラメーター化されたクエリを作成するため、GStringを定義した後

def sql = "select * from ${it}_1";

それをGroovySQLに渡し、クエリを実行しようとすると、実際のクエリは

"select * from :?_1";

当然のことながら、これはMSSQLを狂わせます。
皆さんのおかげで、誰かがこれが役に立つと思うかもしれません。

于 2011-01-25T08:31:26.340 に答える