我正在尝试使用以下代码更改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";
答案 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设置进行测试。