現象:HQL 中 IN (:ids) 參數綁定字串列表,當 ID 以 0 開頭且包含 8 或 9 (如 0418, 0480) 時拋出異常,而 4018, 0417 正常。
0 開頭的數字字面量按**八進制**解析 (Java/JPA 標準行為)。0480 包含 8,非法八進制數字 → 解析錯誤。0417 合法八進制 (十進制 271) → 解析成功但語義錯誤 (變成 271 而非 417)。List ids = Arrays.asList("0418", "0480"); query.setParameterList("ids", ids);IN ('0418', '0480'),字串字面量不受八進制影響。WHERE id IN (CAST(:ids AS STRING)) (視方言支援)。VARCHAR/CHAR,實體屬性用 String,從源頭消除歧義。開啟 Hibernate SQL 日誌 (hibernate.show_sql=true),觀察生成 SQL 是否為 IN ('0418', '0480') 而非 IN (0418, 0480)。
核心教訓:**業務主鍵含前導零、非純數字特徵時,必須用字串類型全鏈路存儲與查詢。**