我有一列的表稱爲@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); –