我有一列的表称为@id
我想执行这个查询:在Hibernate中列名的特殊字符
select DISTINCT "@id" from "osm_art_center"
在Java中
(休眠)。
问题是Hibrernate无法理解@id
并返回一个错误,表明id列不存在。
SQL Error: org.postgresql.util.PSQLException: ERROR: column "id" does not exist
我有一列的表称为@id
我想执行这个查询:在Hibernate中列名的特殊字符
select DISTINCT "@id" from "osm_art_center"
在Java中
(休眠)。
问题是Hibrernate无法理解@id
并返回一个错误,表明id列不存在。
SQL Error: org.postgresql.util.PSQLException: ERROR: column "id" does not exist
尝试引用的列名:
String sql ="select DISTINCT \"@id\" from osm_art_center;
ResultSet polygonSearch = st.executeQuery(sql);
已抛出
String columnName="@id";
String tableName="osm_art_center";
ResultSet polygonSearch;
polygonSearch = st.executeQuery("select DISTINCT "+columnName+" from "+tableName);
错误:
编辑
导致错误代码210
Java语言不会剥离或更改字符串的“@”字符。但是,完全有可能您使用的JDBC驱动程序的行为与您的PostgreSQL命令解释程序的行为不同。
无论哪种方式,请尝试转义特殊字符。
我在这里发生的事情是,Hibernate在传递到数据库时不会引用标识符,因此PostgreSQL正在将未引用的@id
解释为应用于标识符id
的运算符@
。前缀运算符前不需要空格;很像您可以编写a+b
而不是a + b
,因此您可以编写@id
或@ id
将运算符@
应用于列id
。
示范:
test=> CREATE TABLE iddemo("@id" integer);
CREATE TABLE
test=> SELECT @id FROM iddemo;
ERROR: column "id" does not exist
LINE 1: SELECT @id FROM iddemo;
如果你引用它,而不是产生预期的结果标识符:
test=> SELECT "@id" FROM iddemo;
@id
-----
(0 rows)
这是IMO Hibernate的错误。它应该引用它传递给数据库的所有标识符。如果不这样做意味着用户必须手动引用标识符,如果他们想要任何大写字母,包含空格,使用保留字等。它看起来像他们已经修复此错误,但默认情况下未启用此修复程序以实现向后兼容性;见Automatic reserved word escaping for Hibernate tables and columns。
您可以通过在定义中插入引用来解决此错误,尽管它可能在其他地方有副作用。
String columnName="\"@id\"";
或通过在persistence.xml
设置hibernate.globally_quoted_identifiers
到true
全球解决它在Hibernate项目配置(或休眠配置文件或其他)。
什么是错误? –
您应该显示您的代码和错误消息 – Renzo
String columnName =“@ id”; String tableName =“osm_art_center”; ResultSet polygonSearch; polygonSearch = st。executeQuery(“select DISTINCT”+ columnName +“from”+ tableName); –