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

SQL 與 HQL 中邏輯運算子優先級詳解:NOT > AND > OR

     編輯:Java 相關知識

編寫 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 行為說明

Hibernate 解析 HQL 時會依標準 SQL 優先級重組 AST,生成 SQL 時省略冗餘括號。這非 Bug,而是標準化輸出。開發者應在 HQL 中**顯式加括號**表達真實業務意圖,勿依賴生成 SQL 的括號驗證邏輯。

最佳實踐

  1. 複合條件必加括號:WHERE (A AND B) OR (C AND D)
  2. OR 兩側子條件各自加括號
  3. Criteria API / JPA Specifications 可程式化構建,避免字串拼接錯誤
  4. 單元測試覆蓋邊界條件組合

延伸:JPQL/HQL vs SQL 差異

  • HQL 支援實體關聯導航(user.address.city)
  • 大小寫不敏感(關鍵字),但實體/屬性名敏感
  • 無 SELECT *,必須指定選取項
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved