【问题标题】:Special characters in Hibernate column namesHibernate 列名中的特殊字符
【发布时间】:2015-07-11 21:18:46
【问题描述】:

我有一个表,其中有一列名为 @id 我想执行这个查询:

select DISTINCT "@id" from "osm_art_center"

在 Java 中(休眠)。

问题是 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

【问题讨论】:

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

标签: java hibernate postgresql


【解决方案1】:

尝试引用列名:

String sql ="select DISTINCT \"@id\" from osm_art_center;
ResultSet polygonSearch = st.executeQuery(sql);

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 的一个休眠错误。它应该引用它传递给数据库的所有标识符。如果不这样做意味着用户必须手动引用标识符,如果他们想要任何大写、包含空格、使用保留字等。看起来他们已经修复了这个,但默认情况下没有启用修复以实现向后兼容性;见Automatic reserved word escaping for Hibernate tables and columns。

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

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

    或通过在您的 persistence.xml(或 Hibernate 配置文件或其他)中将 hibernate.globally_quoted_identifiers 设置为 true 在您的 Hibernate 项目配置中全局修复它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-20
      • 1970-01-01
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      相关资源
      最近更新 更多