4

I would like to learn how to escape dot in GString so groovy (1.8) does not treat it as a part of an variable inside sql.execute. I have the following code:

  Map<String, String> dbSettings = [schemaName:"testSchema"];

  String myDbPrefix = dbSetting.schemaName + ".";

  sql.execute "DELETE FROM ${myDbPrefix}myTable"

And I got this error:

Ignoring groovy.lang.MissingPropertyException: No such property: myTable for class: java.lang.String 

Clearly indicating that . was interpreted as part of variable ${myDbPrefix}.

Skarab
  • 6,981
  • 13
  • 48
  • 86

2 Answers2

2

Does escaping the embedded variable help?

     sql.execute "DELETE FROM ${Sql.expand myDbPrefix}myTable"
tim_yates
  • 167,322
  • 27
  • 342
  • 338
0

I got hit by this problem today. GStrings get handled by a special way in GroovySQL. It's mentioned in the javadoc. It does automatic parameter binding.

Each value in the GString will become a parameter (?) which gets set as a JDBC prepared statement parameter.

What a surprise!

I'm going to fix the problem in my application by subclassing the Sql class and overriding the GString handling with plain ".toString()" .

Documented in Groovy wiki:

GString Use Cases - GSQL Another use case for GString is GSQL where parameters can be passed into SQL statements using this same mechanism which makes for a neat way to integrate Groovy with other languages like SQL. GroovySql then converts the expressions to ? and uses a JDBC PreparedStatement and passes the values in, preserving their types.

If you explicitly want to coerce the GString to a String you can use the toString() method. Groovy can also automatically coerce GStrings into Strings for you.

Lari Hotari
  • 5,190
  • 1
  • 36
  • 43