java如何从Groovy中没有“${str}”的字符串创建GString
我有来自Java的String
变量(例如,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
)?或者我如何用另一种方式解决这个问题
多谢各位
# 1 楼答案
根据这些信息,我建议以下半个解决方案:
它将用转义的qutoE替换所有双引号,然后将整个内容计算为GString。只要在值部分中不使用双引号,这应该是可行的。然后可以将gstring用于Sql。此解决方案与GROOVY-2505中的前两个求值示例基本相同。marshall遗漏的重要一点显然是,我们需要将字符串内容用引号括起来。一个/“str”/当然只会产生一个字符串“str”。例如,如果str是SELECT,那么这将生成“str”。我们想要的是“'+str+'”,它将给出“SELECT”。它必须是双引号,因为我们希望Eval调用对gstring部分求值,这在单引号字符串中是不可用的