2015-07-11 85 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項目配置(或休眠配置文件或其他)。