Groovy GString в Sql.execute - текстовые переменные не заключены в 'и запрос не выполнен - PullRequest
1 голос
/ 09 ноября 2010

У меня следующая проблема, когда я передаю GString в SQL.executeInsert, текстовые переменные не автоматически добавляются в ', поэтому запрос вставки завершается неудачно:

String value4fa = "I would like to get know"
int value4fb = 2
def query = "INSERT INTO TAB_A (F_A, F_B) VALUES (${value4fa}, ${value4fb})"
sql.executeInsert(query);

Если я поставлю 'сам:

 def query = "INSERT INTO TAB_A (F_A, F_B) VALUES ('${value4fa}', ${value4fb})"

Groovy сообщает мне, что я ввел дыру в безопасности, потому что Groovy не может использовать PreparedStatement для выполнения запроса SQL.

Может кто-нибудь объяснить мне, как заставить Groovy правильно оценить тело запроса и подготовить переменные?

Ответы [ 2 ]

5 голосов
/ 02 марта 2016

Вам не нужно украшать строки чем-либо, чтобы они автоматически конвертировались в PreparedStatement.

sql.execute("INSERT INTO TAB_A (F_A, F_B) VALUES ($value4fa, $value4fb)")

сделает все правильно для всех методов, которые принимают GString в качестве одного параметра. обратите внимание на отсутствие {}, который является синтаксическим сахаром для .toString()

Причина, по которой ваша жалоба вызвана тем, что

def query = "INSERT INTO TAB_A (F_A, F_B) VALUES (${value4fa}, ${value4fb})"
sql.execute(query)

отличается от передачи GString непосредственно методу.

применяет подстановки перед , передавая query методу .execute(). Учитывая данные вашего примера, он передает следующее, и замены уже произошли. "INSERT INTO TAB_A (F_A, F_B) VALUES (I would like to get know, 2)", который даже не является допустимым оператором SQL, поскольку в строковом значении отсутствует ' вокруг него.

Это функционально эквивалентно использованию String.format(), StringBuilder/Buffer.append() или обычному при объединении с использованием +.

0 голосов
/ 09 ноября 2010

Я не проверял эту идею, но код для 2.4.4 здесь .

В методе execute(String sql, List<Object> params) используются подготовленные операторы.

Учитывая это, рассмотрим этот пример:

firstName = "yue"
lastName = "wu"
sql.execute("insert into people (firstName, lastName) "+
  " values (?,?)", [firstName, lastName])

При необходимости легко добавить одинарные кавычки к самим переменным (а не к строке SQL).

...