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

SQL Server 保留字陷阱:user 當資料表名稱導致語法錯誤

     編輯:Java 相關知識

問題現場

將 Tomcat + Struts + Hibernate + MySQL 專案移植至 SQL Server 2000,啟動時拋出:

Hibernate: select user0_.userid as x0_0_ from user user0_
SQL Exception: com.jnetdirect.jsql.JSQLException: 在關鍵字 'user' 附近有語法錯誤。

根因分析

  • MySQL:user 非保留字,可直接做資料表/欄位名稱
  • SQL Server:user 為系統保留字 (系統資料表 sysusers 相關),直接使用會語法錯誤
  • Hibernate 產生的 SQL 未加脫逸符號,導致 from user 解析失敗

解決方案

方案一:重新命名資料表 (推薦)

  • 將資料表 user 改為 employees、app_user、sys_user 等非保留字名稱
  • 同步修改 Hibernate 映射檔 <class table="employees"> 及 HQL 查詢 from Employee

方案二:Hibernate 映射檔加脫逸 (不建議)

<class name="User" table="[user]">  <!-- SQL Server 方括號脫逸 -->
<!-- 或 -->
<class name="User" table="\"user\"">  <!-- ANSI 雙引號脫逸 (需資料庫支援) -->

缺點: 降低可移植性,不同資料庫脫逸語法不同 (MySQL 用反引號 \`user\`,Oracle 用雙引號 "user"),維護成本高。

經驗總結

  1. 命名規範: 資料表/欄位命名避開所有主流資料庫保留字,建議加上前綴 (如 t_user、tbl_user) 或使用複數形式 (如 users)
  2. 參考清單: 開發前查閱目標資料庫保留字清單 (SQL Server、Oracle、MySQL、PostgreSQL 差異大)
  3. 工具輔助: 使用 Hibernate Tools 逆向工程生成映射檔時,啟用自動脫逸選項
  4. 測試驗證: 專案早期執行跨資料庫整合測試,及早發現命名衝突

這個問題耗費半天排查,記錄下來警惕後人。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved