編寫 HQL/JPQL 時發現 Hibernate 生成的 SQL 缺少預期括號,經驗證屬於運算子優先級認知偏差。本文澄清邏輯運算子優先級規則,避免條件表達式語義錯誤。
NOT > AND > OR (由高到低)
即:NOT 結合最緊密,其次 AND,最後 OR。
SELECT 1 FROM dual WHERE (1=1 AND 2=2) OR (3=3 AND 4=4)
AND 優先級高於 OR,等價於:
SELECT 1 FROM dual WHERE 1=1 AND 2=2 OR 3=3 AND 4=4
括號可省略,語義不變。
SELECT 1 FROM dual WHERE (1=1 OR 2=2) AND 3=3
若移除括號:
SELECT 1 FROM dual WHERE 1=1 OR 2=2 AND 3=3
依優先級解析為:1=1 OR (2=2 AND 3=3),語義改變!
原意:(真 OR 假) AND 真 = 真 → 移除後:真 OR (假 AND 真) = 真,雖結果同但邏輯不同,若條件更複雜極易產生 Bug。
Hibernate 解析 HQL 時會依標準 SQL 優先級重組 AST,生成 SQL 時省略冗餘括號。這非 Bug,而是標準化輸出。開發者應在 HQL 中**顯式加括號**表達真實業務意圖,勿依賴生成 SQL 的括號驗證邏輯。
WHERE (A AND B) OR (C AND D)OR 兩側子條件各自加括號user.address.city)SELECT *,必須指定選取項