Java Hibernate列名中的特殊字符

Java Hibernate列名中的特殊字符,java,hibernate,postgresql,Java,Hibernate,Postgresql,我有一个名为@id 我要执行此查询: select DISTINCT "@id" from "osm_art_center" 在Java中(Hibernate) 问题是Hibrernate无法理解@id,并返回一个id列不存在的错误 编辑 导致错误的代码: String columnName="@id"; String tableName="osm_art_center"; ResultSet polygonSearch; polygonSearch = st.executeQuery("se

我有一个名为
@id
我要执行此查询:

select DISTINCT "@id" from "osm_art_center"
在Java中(Hibernate)

问题是Hibrernate无法理解
@id
,并返回一个id列不存在的错误

编辑

导致错误的代码:

String columnName="@id";
String tableName="osm_art_center";
ResultSet polygonSearch;
polygonSearch = st.executeQuery("select DISTINCT "+columnName+" from "+tableName);
已引发的错误:

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);
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)
这是一个休眠错误。它应该引用它传递给数据库的所有标识符。如果不这样做,则意味着用户必须手动引用标识符,如果他们需要大写字母、包含空格、使用保留字等。看起来他们已经解决了这个问题,但默认情况下没有启用向后兼容的修复;看

您可以通过在定义中插入引号来解决此错误,尽管它可能会在其他地方产生副作用

String columnName="\"@id\"";

或者通过在
persistence.xml
(或Hibernate配置文件或其他文件)中将
Hibernate.globally\u quoted\u identifiers
设置为
true
,在Hibernate项目配置中全局修复它。

您应该显示代码和错误消息我认为错误是根据postgres返回的,而不是java。尝试在您的SGBD中执行此查询。您为什么要将列命名为“@id”?当然,这是合法的,但它会带来问题。另外,提示:
@
是Unicode,但方式与
a
是Unicode相同。它是ASCII的7位子集的一部分,ASCII是几乎所有系统中最基本的字符集。您发布的代码似乎不是Hibernate代码。您正在对名为
st
的变量调用
executeQuery
,并返回
ResultSet
。这看起来像是原始的JDBC代码。你认为Hibernate是如何参与其中的?您的查询也是
select DISTINCT@id from osm_art_center
,而不是
select DISTINCT“@id from“osm_art_center”
。如果您想在原始JDBC连接上运行自己的SQL,您需要自己引用标识符。见下文@paulsm4的答案。