代码之家  ›  专栏  ›  技术社区  ›  Alexey Sviridov

groovy gstring问题

  •  0
  • Alexey Sviridov  · 技术社区  · 15 年前

    我想在groovy gstring中使用$macro。当我写下这些代码时

    ['cdata','tdata'].each { def sql = "select * from $it_1" }

    我得到错误未知属性$it_

    好吧,我重写一下

    ['cdata','tdata'].each { def sql = "select * from ${it}_1" }

    然后在结果字符串中得到不需要的引号-“select*from'cdata”\u 1

    问题是我如何在GString中使用$-宏来获得“从CDATAY1”选择字符串的“选择*”?

    4 回复  |  直到 9 年前
        1
  •  4
  •   Adam C    14 年前

    这里可以使用Groovy的SQL扩展功能来帮助。以下代码将完成此操作:

    ['cdata','tdata'].each {table -> def sql = "select * from ${Sql.expand table}_1" }
    

    如果gstring中有其他参数,则使用此方法尤为重要:

    def name = 'Charlie Sheen'
    def tables = ['normalPeople','crazyPeople']
    tables.each { table -> 
        def sqlString = "select * from ${Sql.expand table} where name = ${name}"
        /* Execute SQL here */
    }
    

    在上面的示例中,仍将使用准备好的语句,“name”变量的内容仍将作为参数处理(从而有助于保护您免受SQL注入攻击),但表变量参数将正确展开。

        2
  •  1
  •   Geo    15 年前

    如果引号不是来自IDE,或者您正在评估的代码,那么您可以这样做:

    ['cdata','tdata'].each { def sql = "select * from ${it.replaceAll("'","")}_1" } 
    
        3
  •  0
  •   Aaron Saunders    15 年前
    groovy:000> ['cdata','tdata'].each { def sql = "select * from ${it}_1"; println sql }
    select * from cdata_1
    select * from tdata_1
    ===> [cdata, tdata]
    

    我看不到任何引用…这就是我要澄清的原因。

        4
  •  0
  •   Eel Lee Akarsh    9 年前

    真正的答案是在这个问题后面,所以我很抱歉。
    groovy sql从gstring进行参数化查询,因此在我定义了gstring之后

    def sql = "select * from ${it}_1";
    

    我把它传递给Groovy SQL,当我尝试执行查询时,实际查询是

    "select * from :?_1";
    

    这让mssql抓狂。
    再次感谢你们,也许有人会觉得这很有用。