首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

MySQL + Hibernate:實體字段與關鍵字衝突的優雅解法——反引號轉義

     編輯:Java 綜合教學

MySQL + Hibernate:實體字段與關鍵字衝突的優雅解法——反引號轉義

場景:MySQL 表字段名 usage 是保留字,Hibernate 生成 SQL 未轉義導致語法錯誤:

ERROR: You have an error in your SQL syntax near 'usage' at line 1

快速修復:映射文件加反引號

<hibernate-mapping>
  <class name="com.entity.Test" table="test">
    <id name="id" column="id"><generator class="native"/></id>
    <!-- 關鍵:column 屬性值用反引號包裹 -->
    <property name="usage" column="`usage`" type="string" length="1"/>
  </class>
</hibernate-mapping>
  • ` 為鍵盤左上角 ~ 鍵,**非單引號 '**。
  • Hibernate 將原樣輸出到 SQL:SELECT `usage` FROM test,MySQL 正確識別為標識符。
  • 無需修改實體類字段名、表結構、DAO 代碼,**零侵入修復**。

為何不建議長期依賴此方案?

  1. 代碼生成器會覆蓋:逆向工程生成實體/映射時**不會自動加反引號**,再次生成即復發。
  2. 團隊維護成本高:新成員不知情,改動映射文件後忘記加反引號。
  3. 可移植性差:遷移到 Oracle/PostgreSQL 時反引號語法不同(Oracle 用雙引號 "usage",PG 同)。

根治建議:命名規範預防

註解配置寫法

@Entity
@Table(name = "test")
public class Test {
    @Id @GeneratedValue
    private Long id;

    @Column(name = "`usage`") // 同理加反引號
    private String usage;
    // getter/setter
}

總結

反引號是止痛藥,規範命名才是根治方案。 緊急上線可用反引號救急,事後務必納入技術債清單,下個迭代重構字段名。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
策略示例優勢
後綴 _usage_, order_, group_明確區分、不影響語義
前綴業務縮寫usr_usage, ord_order命名空間隔離、自文檔化
避開保留字表建表前查閱 MySQL 保留字列表源頭消除風險