2016-08-24 12 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から答えを得ました3210私はこのようなクエリを変更し、それは働いた。

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

Javaパーサはクエリパラメータのプレースホルダとして ':word_boudaries'を取得します。たぶん、セミコロン(私はJavaを使用しない)をエスケープしようとします。 – klin

+1

@ニースあなた自身の質問に答えることができます。解決部分を問題にするのではなく、答えとして追加する方がよいでしょう。 48時間後にあなた自身の答えを受け入れることができます。一方、あなたの質問がその質問と重複している場合は、それに印を付けてください。 –

答えて

2

":"は名前付きパラメータのプロンプトです。 ORMセッションで直接クエリを実行すると、ORMは解析して変換しようとします。あなたは、最新の休止Sessionを使用している、あなたはthis答えは説明として、低いレベル(JDBC接続)でクエリを実行する必要がありますと仮定し

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"); 
      } 
     } 
    } 
); 

を言われていること、あなたは絶対に確信していますORMからDDLを実行したいですか?そこに他のソリューションがあります。プロジェクトがMavenの場合は、SQL Maven pluginを使用して、テスト用のSQL設定を作成してから削除することができます。

関連する問題