SQLGrammerException:无法执行语句

时间:2016-08-24 07:23:11

标签: sql spring postgresql

我正在尝试使用以下代码更改postgreSQL表。

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

1 个答案:

答案 0 :(得分: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");
            }
        }
    }
);

话虽如此,您是否确定要从ORM执行DDL?还有其他解决方案。如果你的项目是Maven,你可以使用SQL Maven plugin放下然后拆除SQL设置进行测试。