在休眠中将“反引号”添加到列名

Posted

技术标签:

【中文标题】在休眠中将“反引号”添加到列名【英文标题】:Add `backticks` to column names in hibernate 【发布时间】:2018-06-10 12:24:09 【问题描述】:

考虑查询

INSERT INTO order (id, key, value) VALUES (?, ?, ?);

上述查询中存在 mysql 语法错误,因为 orderkey 是 MySQL 中的关键字。所以解决方案是在查询中添加反引号。

INSERT INTO `order` (id, `key`, value) VALUES (?, ?, ?);

Hibernate 很笨,不会自动执行此操作。根据this answer,通过在hibernate配置文件中添加如下属性解决了表名问题。

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

但这只会给数据库名和表名添加反引号。列名仍然存在问题。

如何为所有列名添加反引号?


休眠版本:3.6.10.Final MySQL 版本:5.7 hibernate.dialect : org.hibernate.dialect.MySQL5Dialect JDK 版本:1.8(如果有任何关系)

【问题讨论】:

值得注意的是,您使用的是过时版本的 Hibernate。 【参考方案1】:

我找到了一种在 hibernate 中为列名添加反引号的方法。

    打开与已映射的pojo文件相关的xml文件(TableName.hbm.xml)。

    查找相关列的属性。

    <property name="key" type="string">
        <column name="key" />
    </property>
    

    用方括号括住列名。

    <property name="key" type="string">
        <column name="[key]" />
    </property>
    

但这是一个艰苦的过程,因为您必须对所有 MySQL keywords 的所有列一一进行此操作。最好的方法是避免将MySQL keywords 添加为您的数据库、表或列名。

参考资料:

How to use database reserved keyword in Hibernate ?

【讨论】:

以上是关于在休眠中将“反引号”添加到列名的主要内容,如果未能解决你的问题,请参考以下文章

反引号``叫啥?

CodeIgniter 2.0.3 中 Active Record 中奇怪的反引号行为

在 shell 中的双引号字符串中转义反引号

MySQL中单引号,双引号和反引号的区别

何时在 MySQL 中使用单引号、双引号和反引号

何时在 MySQL 中使用单引号、双引号和反引号