4

groovy(1.8)がそれをsql.execute内の変数の一部として扱わないように、GStringでドットをエスケープする方法を学びたいと思います。私は次のコードを持っています:

  Map<String, String> dbSettings = [schemaName:"testSchema"];

  String myDbPrefix = dbSetting.schemaName + ".";

  sql.execute "DELETE FROM ${myDbPrefix}myTable"

そして、私はこのエラーを受け取りました:

Ignoring groovy.lang.MissingPropertyException: No such property: myTable for class: java.lang.String 

そのことを明確に示しています。変数${myDbPrefix}の一部として解釈されました。

4

2 に答える 2

2

埋め込み変数のエスケープは役に立ちますか?

     sql.execute "DELETE FROM ${Sql.expand myDbPrefix}myTable"
于 2011-06-17T09:11:32.807 に答える
0

今日、この問題に見舞われました。GStrings は、GroovySQL の特別な方法で処理されます。javadoc に記載されています。自動パラメーターバインディングを行います。

GString の各値は、JDBC プリペアド ステートメント パラメータとして設定されるパラメータ (?) になります。

驚いた!

Sql クラスをサブクラス化し、プレーンな ".toString()" で GString 処理をオーバーライドすることで、アプリケーションの問題を修正します。

Groovy wiki に記載されています:

GString ユース ケース - GSQL GString のもう 1 つのユース ケースは GSQL です。GSQL は、Groovy を SQL などの他の言語と統合するための適切な方法となる同じメカニズムを使用してパラメーターを SQL ステートメントに渡すことができます。次に、GroovySql は式を ? に変換します。JDBC PreparedStatement を使用して値を渡し、その型を保持します。

GString を String に明示的に強制したい場合は、 toString() メソッドを使用できます。Groovy は、自動的に GStrings を Strings に変換することもできます。

于 2012-05-24T07:52:01.253 に答える