Groovy GString issues

后端 未结 4 1816
后悔当初
后悔当初 2020-12-22 09:17

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 ge

相关标签:
4条回答
  • 2020-12-22 09:26

    Real answer was behind the question, so I'm sorry.
    Groovy SQL makes parameterized query from GString, so after I had defined GString

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

    I passed it to Groovy SQL and when I tried to execute the query, the actual query was

    "select * from :?_1";
    

    Of cource this drives MSSQL crazy.
    Thanks to you all again, maybe someone will find this useful.

    0 讨论(0)
  • 2020-12-22 09:41

    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.

    0 讨论(0)
  • 2020-12-22 09:42
    groovy:000> ['cdata','tdata'].each { def sql = "select * from ${it}_1"; println sql }
    select * from cdata_1
    select * from tdata_1
    ===> [cdata, tdata]
    

    I dont see any quotes... that is why I was asking for clarification

    0 讨论(0)
  • 2020-12-22 09:47

    If the quotes are not from your IDE, or whatever you're evaluating your code in, you can do this:

    ['cdata','tdata'].each { def sql = "select * from ${it.replaceAll("'","")}_1" } 
    
    0 讨论(0)
提交回复
热议问题