我有来自Java的String
变量(例如,str
),它存储了一些GString
表达式,比如"SELECT ${path} path FROM dual"
,它绝对是来自用户输入的动态字符串,我不知道,会有多少${}
。
我希望不要在使用sql.rows()
的当前绑定的${path}
评估PreparedStatement
中使用它。
问题是:
str
转换为GString
,则会抛出SQLException
,因为如果没有PreparedStatement
我们需要在'${path}'
周围使用引号。但它不安全,Groovy会生成警告(我们应该使用PreparedStatement
并删除引号)。str
转换为GString
:sql.rows("${str}")
,那么Groovy将使用绝对错误的预备语句,其中只包含"?"
,当然,它赢得了'工作,我需要声明:"SELECT ? path FROM dual"
。 问题我们如何从GString
获取String
而不用"${}"
包裹它?或者我们如何仅评估GString
的第一级(仅str
,而不是path
)?或者我如何以其他方式解决这个问题?
谢谢。
答案 0 :(得分:0)
根据我建议的以下一半解决方案的信息:
def gsring = Eval.me('"'+str.replaceAll("\"","\\"")+'"')
它将用转义的qutoes替换所有双引号,然后将整个事物评估为GString。只要在值部分中不使用双引号,这应该有效。然后可以将gstring用于Sql。该解决方案与GROOVY-2505中的前两个评估示例基本相同。马歇尔错过的重要一点显然是我们需要将字符串内容包装在引号中。 A /“str”/当然只会产生一个字符串“str”。如果str是例如SELECT,那么这将产生“str”。我们想要的是'''+ str +'“',它将给出”SELECT“。它必须是双引号,因为我们希望Eval调用来评估gstring部分,这在单引号字符串中不可用。