2016-08-24 4 views
2

Я пытаюсь изменить таблицу postgreSQL, используя следующий код.SQLGrammerException: не удалось выполнить оператор

String query = "ALTER TABLE \"georbis:world_boundaries\" DROP COLUMN testcolumn"; 
sessionFactory.openSession().createSQLQuery(query).executeUpdate(); 

Проблема: мое имя таблицы содержит двоеточие (:), из-за которого я получаю следующую ошибку.

ERROR: unterminated quoted identifier at or near ""georbis? DROP COLUMN testcolumn" at character 13 
STATEMENT: ALTER TABLE "georbis? DROP COLUMN testcolumn 

Другие ответы подобные вопросы предполагают, что я должен поставить двойные кавычки (") вокруг имени таблицы, которые я пытался, но все еще получаю ту же ошибку.

Кроме того, когда я запускаю тот же запрос от . редактор SQL работает прекрасно Я также попытался запустить тот же запрос для таблицы, которая не содержит двоеточие (:), и она работала

Решение.. Спасибо всем Получил ответ от HERE Я изменил свой запрос таким образом, и он сработал.

String query = "ALTER TABLE \"georbis\\:world_boundaries\" DROP COLUMN testcolumn"; 
+2

Кажется, что парсер Java получает ': word_boudaries' в качестве заполнителя для параметра запроса. Может быть, попытайтесь избежать точки с запятой (я не использую Java). – klin

+1

@Neelesh Вы можете ответить на свой вопрос. Лучше добавить часть решения в качестве ответа вместо того, чтобы дать ему вопрос. И через 48 часов вы можете принять свой собственный ответ. С другой стороны, если ваш вопрос дублирует этот вопрос, отметьте его так. –

ответ

2

Проблема заключается в том, что «:» это подсказка для имени параметра. Выполнение запроса непосредственно в сеансе ORM означает, что ORM попытается разобрать его и преобразовать.

Предполагая, что вы используете последний Hibernate Session, вам нужно будет выполнить запрос на более низком уровне (JDBC соединение), а this ответ описывает:

sessionFactory.openSession().doWork(
    new Work() { 
     public void execute(Connection connection) throws SQLException 
     { 
      try(Statement stmt=connection.createStatement()){ 
       stmt.executeUpdate("ALTER TABLE \"georbis:world_boundaries\" DROP COLUMN testcolumn"); 
      } 
     } 
    } 
); 

Это, как говорится, ты абсолютно уверен, что вы хотите выполнить DDL из ORM? Есть и другие решения. Если ваш проект - Maven, вы можете использовать SQL Maven plugin, чтобы разложить, а затем снести настройки SQL для тестирования.

Смежные вопросы