2015-07-11 49 views
3

我有一列的表称为@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 
+0

什么是错误? –

+0

您应该显示您的代码和错误消息 – Renzo

+0

String columnName =“@ id”; String tableName =“osm_art_center”; ResultSet polygonSearch; polygonSearch = st。executeQuery(“select DISTINCT”+ columnName +“from”+ tableName); –

回答

3

尝试引用的列名:

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命令解释程序的行为不同。

无论哪种方式,请尝试转义特殊字符。

2

我在这里发生的事情是,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_identifierstrue全球解决它在Hibernate项目配置(或休眠配置文件或其他)。