如何在没有" $ {str}"的情况下从String创建GString在Groovy中

时间:2014-12-19 16:11:27

标签: java string groovy gstring

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

我希望不要在使用sql.rows()的当前绑定的${path}评估PreparedStatement中使用它。

问题是:

  1. 如果我不以某种方式将str转换为GString,则会抛出SQLException,因为如果没有PreparedStatement我们需要在'${path}'周围使用引号。但它不安全,Groovy会生成警告(我们应该使用PreparedStatement并删除引号)。
  2. 如果我以这种方式将str转换为GStringsql.rows("${str}"),那么Groovy将使用绝对错误的预备语句,其中只包含"?",当然,它赢得了'工作,我需要声明:"SELECT ? path FROM dual"
  3. 问题我们如何从GString获取String而不用"${}"包裹它?或者我们如何仅评估GString的第一级(仅str,而不是path)?或者我如何以其他方式解决这个问题?

    谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

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