有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何从Groovy中没有“${str}”的字符串创建GString

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

我不想在当前绑定使用PreparedStatement${path}求值的sql.rows()中使用它

问题是:

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

问题是我们如何从String中获取GString,而不使用"${}"包装它?或者,我们如何仅评估GString的第一级(仅str,而不是path)?或者我如何用另一种方式解决这个问题

多谢各位


共 (1) 个答案

  1. # 1 楼答案

    根据这些信息,我建议以下半个解决方案:

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

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