Gsql не выполняется при построении запроса

#sql #grails #groovy

#sql #grails #groovy

Вопрос:

Я хочу запустить запрос на обновление, обычно с помощью groovy мы делаем что-то вроде :

 sql.executeUpdate("update MYTABLE l set field1  where l.id = ${someobj.id}")
  

Вышесказанное работает отлично, но моя проблема в том, что я не знаю заранее, сколько параметров мне нужно обновить. Итак, я создал функцию, которая возвращает
properttoudate1 = value1 , propertytoupdate2 = value2 .. и так далее..
Затем я изменил приведенный выше запрос на

 sql.executeUpdate("update MYTABLE l set ${makeQueryString(propertiesToUpdate)} where l.id = ${someobj.id}")
  

Теперь это выдает ошибку::

 com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''PROPERTY1 = 1' where l.id = 'PROPERTVALUE1'' at line 1
  

ЕСТЬ ИДЕИ??

Комментарии:

1. Почему вы используете для этого необработанный SQL вместо GORM?

2. какое возвращаемое значение ${makeQueryString(propertiesToUpdate)} ?

3. @StevieG: ${makeQueryString(propertiesToUpdate)} возвращает FIELDNAME1 = VALUE1

Ответ №1:

Вам нужно сообщить Groovy, что fieldname является статическим, и его не следует заменять с ? помощью Sql.expand :

 sql.executeUpdate("update MYTABLE l set ${Sql.expand(makeQueryString(propertiesToUpdate))} where l.id = ${someobj.id}")
  

Комментарии:

1. Сработало!! Спасибо. Возможно, вы можете пролить больше света на проблему.

2. Да, просто прочитайте это. Спасибо. Я думал, что это проблема с GString.

3. @NikhilSharma Нет, это Sql-класс Groovy пытается быть слишком полезным и превращает ваш первый параметр FIELDNAME1 = VALUE1 в ? параметр a PreparedStatement (который затем является недопустимым Sql 🙂