Побег точка от GString - PullRequest
       46

Побег точка от GString

4 голосов
/ 17 июня 2011

Я хотел бы узнать, как экранировать точку в GString, чтобы groovy (1.8) не рассматривал ее как часть переменной внутри sql.execute . У меня есть следующий код:

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

  String myDbPrefix = dbSetting.schemaName + ".";

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

И я получил эту ошибку:

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

Четко указывает на это. был интерпретирован как часть переменной $ {myDbPrefix}.

Ответы [ 2 ]

2 голосов
/ 17 июня 2011

Помогает ли экранирование встроенной переменной?

     sql.execute "DELETE FROM ${Sql.expand myDbPrefix}myTable"
0 голосов
/ 24 мая 2012

Я получил эту проблему сегодня.GStrings обрабатываются специальным способом в GroovySQL.Это упомянуто в Javadoc.Он выполняет автоматическое связывание параметров.

Каждое значение в GString станет параметром (?), Который устанавливается в качестве подготовленного JDBC параметра оператора.

Какой сюрприз!

Я собираюсь исправить проблему в своем приложении, создав подкласс класса Sql и переопределив обработку GString с помощью простого ".toString ()".

Документировано в Groovy wiki :

Варианты использования GString - GSQL Другим примером использования GString является GSQL, где параметры могут быть переданы в операторы SQL с использованием этого же механизма, что обеспечивает удобный способ интеграции Groovy с другими языками, такими как SQL.GroovySql преобразует выражения в?и использует JDBC PreparedStatement и передает значения, сохраняя их типы.

Если вы явно хотите привести GString к String, вы можете использовать метод toString ().Groovy также может автоматически привести GStrings в Strings для вас.

...