1. 程式人生 > 其它 >Mybatis 判斷 Integer型別,值為0動態SQL不生效

Mybatis 判斷 Integer型別,值為0動態SQL不生效

技術標籤:踩坑筆記javamybatis

記一次:Mybatis 判斷 Integer型別,值為0動態SQL不生效

場景是這樣的:

select * from tableName
where 1=1
  <if test="status!=null and status!=''">and `status` = #{status}</if>

我的status是這樣定義的:0-待稽核,1-已通過,2-已駁回,3-未認證
之前一直沒發現這個BUG是因為: 1-待稽核,2-已通過,3-已駁回,4-未認證
只有當status=0的時候這個動態SQL才不生效!!!好奇怪!


那這就是這個0在作怪了。

通過Mybatis原始碼的分析知道:
mybatis在預編譯sql時,使用OGNL表示式來解析if標籤,對於Integer型別屬性,在判斷不等於’ '時,例如我寫的那樣 status != ’ ',OGNL會返回 ’ ’ 的長度,

原始碼:
在這裡插入圖片描述

故 表示式status != ’ '會被當做status != 0來判斷,所以當status=0時,if條件判斷不通過,動態SQL也就不生效啦。

我們只需要將status!=’ '條件去掉就可以解決上面這個問題。至於程式碼中的業務邏輯,看看能不能在service中處理吧。。。


翻到了一篇比較好的部落格解釋,分享一下:
Mybatis if判斷Integer型別的值不等於’‘引發的問題(!=’'等價於!=0)