剛才寫一條hql語句,想起來之前上學那會老師的教誨:用到or的時候防止邏輯出錯把需要or的條件用括號括起來。在寫hql的時候就很注意,把需要or的條件括了起來,然後執行的時候看了下Hibernate執行的sql語句卻沒有括號,這會犯疑惑了,難道是Hibernate出問題了,通過一番求證,得出如下結論:並不是Hibernate出錯了,而是自己基礎太差了。下邊就這個問題來分析下。
給大家看兩條語句
1、select 1 from dual where (1=1 and 2=2) or (3=3 and 4=4) (這裡考下大家,是否需要加括號呢?)
2、select 1 from dual where (1=1 or 2=2) and 3=3 (這裡考下大家,是否需要加括號呢?)
對於第一條語句如果加上括號是多余的,由於表達式的優先級為(非>與>或)即(not > and > or),可得出就算去掉括號也是無關緊要的。
對於第二條語句如果去掉括號語句就變成了select 1 from dual where 1=1 or (2=2 and 3=3) 為了表達清楚意思故意用括號把2=2 and 3=3 括了起來。這樣就跟要表達的意思不一致了。