如何在 Groovy 中从字符串创建 GString 而无需"${str}"



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

而且我不想使用它与使用PreparedStatement的当前绑定的评估${path} sql.rows()一起使用。

问题是:

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

问题是我们如何在不用"${}"包裹的情况下从String中获取GString?或者我们如何只评估第一级GString(只有str,而不是path(?或者我如何以另一种方式解决此问题?

谢谢。

根据

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

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

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

相关内容

  • 没有找到相关文章