SQLGrammer异常 : could not execute statement

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

最佳答案

问题在于“:”是命名参数的提示。直接在 ORM session 中执行查询意味着 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 设置以进行测试。

关于SQLGrammer异常 : could not execute statement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39116887/

相关文章:

java - 升级到 spring 4.1.6 后@JsonIgnore 不起作用

Spring Dataflow 概念澄清

sql - 简化不同年份的 CTE 值

java - JAXRS/Spring/CXF 端点配置中的合约详细信息——命名空间、PublishedUrl 等

mysql - SQL 'LIKE BINARY' 比普通 'LIKE' 慢吗?

postgresql - 在 PostgreSQL 中将 HEX 作为 BYTEA 插入是否有充分的理由?

使用 Grails 的 Hibernate 和 postgreSQL

sql - 未提供 ORDER BY 时 postgres 如何排序结果

SQL 约束首字母大写

mysql - SQL查询以通过连接获取与最大值对应的行