2

私は、いくつかの式を格納するStringJava の変数 (たとえば、 ) を持っています。これは、ユーザー入力からの完全に動的な文字列であり、いくつあるかわかりません。strGString"SELECT ${path} path FROM dual"${}

そして、現在のバインディングを使用しsql.rows()て評価されたものでは使用したくありません。${path}PreparedStatement

問題は:

  1. 何らかの形で変換strしないと、GStringがスローされます。しかし、それは安全ではなく、Groovy は警告を生成します (引用符を使用して削除する必要があります)。SQLExceptionPreparedStatement'${path}'PreparedStatement
  2. この方法に変換するstrGString: sql.rows("${str}")、Groovy は完全に間違った準備済みステートメントを使用しますが"?"、もちろん、それは機能しません。ステートメントが必要です"SELECT ? path FROM dual"

問題は、 ?でラップせずにどうやって取得できるGStringかです。あるいは、 (only , not )の最初のレベルだけを評価するにはどうすればよいでしょうか? または、この問題を別の方法で解決するにはどうすればよいですか?String"${}"GStringstrpath

ありがとうございました。

4

1 に答える 1

0

情報によると、次の半分の解決策を提案します。

def gsring = Eval.me('"'+str.replaceAll("\"","\\"")+'"')

すべての二重引用符をエスケープされた引用符に置き換え、全体を GString として評価します。値の部分で二重引用符が使用されていない限り、これは機能するはずです。次に、gstring を Sql に使用できます。このソリューションは、GROOVY-2505 の最初の 2 つの評価例と基本的に同じです。marshall が見落としている重要な点は、文字列の内容を引用符で囲む必要があることです。/"str"/ はもちろん文字列 "str" を生成します。str がたとえば SELECT の場合、これは "str" を生成します。必要なのは '"'+str+'"' で、これは "SELECT" を返します。一重引用符で囲まれた文字列では使用できない gstring 部分を Eva​​l 呼び出しで評価する必要があるため、二重引用符で囲む必要があります。

于 2014-12-27T15:01:20.637 に答える