2

我有String来自 Java 的变量(例如,str),它存储一些GString表达式,可以说,它绝对是来自用户输入的动态字符串,我不知道会有"SELECT ${path} path FROM dual"多少。${}

而且我不想在通过当前绑定sql.rows()评估的情况下使用它。${path}PreparedStatement

问题是:

  1. 如果我不strGString某种方式转换,它将抛出SQLException,因为没有PreparedStatement我们需要在 . 周围使用引号'${path}'。但它是不安全的,而且 Groovy 会生成警告(我们应该使用PreparedStatement和删除引号)。
  2. 如果我将转换strGString这种方式:sql.rows("${str}"),那么 Groovy 将使用绝对错误的准备好的语句,其中只包含"?",当然,它不起作用,我需要语句:"SELECT ? path FROM dual"

问题是我们如何GStringString使用 包装它"${}"?或者我们如何才能只评估GString(only str, not path) 的第一级?或者我该如何以其他方式解决这个问题?

谢谢你。

4

1 回答 1

0

根据信息我建议以下半解决方案:

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

它将用转义的 qutoes 替换所有双引号,然后将整个事物评估为 GString。只要值部分中没有使用双引号,这应该可以工作。然后可以将gstring用于Sql。该解决方案与 GROOVY-2505 中的前两个评估示例基本相同。marshall 遗漏的重要一点显然是我们需要将字符串内容用引号括起来。/"str"/ 当然只会产生一个字符串 "str"。如果 str 是例如 SELECT,那么这将产生“str”。我们想要的是'"'+str+'"',它会给出“SELECT”。它必须是双引号,因为我们希望 Eval 调用来评估 gstring 部分,这在单引号字符串中不可用。

于 2014-12-27T15:01:20.637 回答