#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
в?
параметр aPreparedStatement
(который затем является недопустимым Sql 🙂