我正在尝试使用以下代码更改 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/