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

Hibernate HQL IN 查詢報錯:ID 以 0 開頭含 8/9 被誤識別為八進制數字面量

     編輯:程式設計綜合問答

現象:HQL 中 IN (:ids) 參數綁定字串列表,當 ID 以 0 開頭且包含 8 或 9 (如 0418, 0480) 時拋出異常,而 4018, 0417 正常。

根本原因:數字字面量解析規則

  • HQL/JPQL 解析器將**不帶引號的數字序列**視為數字字面量。
  • 以 0 開頭的數字字面量按**八進制**解析 (Java/JPA 標準行為)。
  • 0480 包含 8,非法八進制數字 → 解析錯誤。
    0417 合法八進制 (十進制 271) → 解析成功但語義錯誤 (變成 271 而非 417)。

解決方案:強制字串類型

  1. 參數綁定字串集合 (推薦):
    List ids = Arrays.asList("0418", "0480");
    query.setParameterList("ids", ids);
    Hibernate 會生成 IN ('0418', '0480'),字串字面量不受八進制影響。
  2. HQL 中顯式轉型:
    WHERE id IN (CAST(:ids AS STRING)) (視方言支援)。
  3. 避免數字型 ID 存儲前導零:
    資料庫欄位定義為 VARCHAR/CHAR,實體屬性用 String,從源頭消除歧義。

驗證

開啟 Hibernate SQL 日誌 (hibernate.show_sql=true),觀察生成 SQL 是否為 IN ('0418', '0480') 而非 IN (0418, 0480)。

核心教訓:**業務主鍵含前導零、非純數字特徵時,必須用字串類型全鏈路存儲與查詢。**

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