Search code examples
groovygstring

Groovy GString issues


I'm want use $ macro in groovy GString. When i'm wrote this code

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

i'm get error unknown property $it_

ok, i'm rewrite it

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

then i'm get unwanted quotes in result string - "select * from 'cdata'_1"

Question is how i'm can use $-macro in GString to achive "select * from cdata_1" result string?


Solution

  • You can use Groovy's Sql expand feature to help here. The following code will do the trick:

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

    Using this method is particularly important if you have other parameters in your 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 */
    }
    

    In the example above a prepared statement will still be used, and the contents of the 'name' variable will still be handled as a parameter (thus helping to protect you against SQL injection attacks) but the table variable parameter will be expanded correctly.