java 休眠更新 mySQL 表中保留字作为列名的行的解决方法

Workaround for java hibernate to update row in mySQL tables with reserved words as column names

我需要连接到一个遗留数据库,其中的表的列名如 'like'。解决此问题的最合乎逻辑的方法是重命名列,但数据库管理员不想对现有数据库执行任何更改。

有没有办法解决此问题以强制休眠添加反引号?

有多种解决方法,具体取决于上下文:

  • 对于XML映射文件,关键字用引号括起来1.

  • 对于 Hibernate 注释,用引号将关键字括起来2

  • 你可以告诉 Hibernate 引用所有 SQL 标识符:

    hibernate.globally_quoted_identifiers=true
    

    在 Hibernate 设置文件中。

  • 在 HQL 中,您可以通过自定义转换器转义 别名;有关示例,请参阅 。

参考文献:


1 - 不同的来源说使用 Hibernate 应该知道如何翻译的特定于数据库的引号或反引号。我无法检查这一点。两种方法都可行。

2 - 显然可以使用双引号(转义)和方括号。

你能检查并尝试将这些设置标记为 true 吗?

hibernate.globally_quoted_identifiers = true
hibernate.globally_quoted_identifiers_skip_column_definitions = true

来自 Hibernate 文档,我引用:(https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/appendices/Configurations.html)

hibernate.globally_quoted_identifiers (e.g. true or false (default value)) Should all database identifiers be quoted.
hibernate.globally_quoted_identifiers_skip_column_definitions (e.g. true or false (default value))
Assuming hibernate.globally_quoted_identifiers is true, this allows the global quoting to skip column-definitions as defined by javax.persistence.Column, javax.persistence.JoinColumn, etc, and while it avoids column-definitions being quoted due to global quoting, they can still be explicitly quoted in the annotation/xml mappings.