我有String
来自Java的变量(例如,str
(,它存储了一些GString
表达式,比方说"SELECT ${path} path FROM dual"
,它绝对是来自用户输入的动态字符串,我不知道,会有多少${}
。
而且我不想使用它与使用PreparedStatement
的当前绑定的评估${path}
sql.rows()
一起使用。
问题是:
- 如果我不以某种方式将
str
转换为GString
,它会抛出SQLException
,因为如果没有PreparedStatement
,我们需要在'${path}'
周围使用引号。但它是不安全的,Groovy生成警告(我们应该使用PreparedStatement
并删除引号(。 - 如果我以这种方式将
str
转换为GString
:sql.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 调用来计算字符串部分,这在单个引号字符串中不可用。