【问题标题】:Make hibernate backquote all table / column names使休眠反引号所有表/列名
【发布时间】:2026-01-07 13:15:01
【问题描述】:

我面临着为使用 MySQL 5.0 而编写的遗留系统,现在需要将其迁移到 MySQL 5.5(要求)。我发现有一列名为maxvalue,这似乎是 MySQL 5.5 中的系统字。因此,我所有包含此列的 Hibernate 查询都会出现语法错误:

Caused by: java.sql.BatchUpdateException: You have an error in your SQL 语法;检查与您的 MySQL 服务器相对应的手册 在 'maxvalue

附近使用正确语法的版本

Hibernate 似乎不会自动反引号 ` 围绕字段名称。如果我提取查询,反引号 `maxvalue` 它在 MySQL 5.5 中正确运行。

我发现solution 如何为特定字段/表显式强制反引号。问题是我不确定有多少其他列名会产生这样的问题。 有没有办法告诉 Hibernate 自动反引号所有表/列名?(这会产生有效的 SQL,我不知道为什么它默认不为 MySQL 这样做)。

编辑This discussion 几乎让我相信我想要的东西是不可能的。

【问题讨论】:

  • 由于hibernate是一个开源项目.... :)
  • @JermaineXu 是的,我们都有时间停下来学习和修复别人的代码……

标签: java mysql hibernate escaping


【解决方案1】:

为此目的有一个non-documented 属性。使用,

<property name="hibernate.globally_quoted_identifiers" value="true"/>

<property name="hibernate.globally_quoted_identifiers">true</property>

【讨论】:

  • 完美!谢谢!现在这个属性至少记录在某个地方。遗憾的是,我正在运行 hibernate 3.3,似乎这个属性是在 3.5 中引入的。我将无法验证此属性是否确实有效,但我将您的答案标记为已接受。
  • 对于使用 Spring 的人:application.properties 属性为:'spring.jpa.properties.hibernate.globally_quoted_identifiers=true'
  • “没有没有文档记录的特性。如果你的用户不知道一个特性,它就是一个非特性。摆脱它;它只是使源代码复杂化。” -- developer.jboss.org/wiki/WhyThisProjectIsSuccessful
  • 这只会给表名和数据库名添加反引号。列仍然相同...insert into 'default_settings' (account, key, value) values (?, ?, ?)。问题在于列名key