mybatis框架中的queryWrapper的or查询,联想到MySQL中and 和or的关系
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                mybatis框架中的queryWrapper的or查询,联想到MySQL中and 和or的关系
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.                        
                                統(tǒng)計的原生SQL應該是這樣的:
SELECTCOUNT( 1 ) FROMtable_name WHERE( id = '679135XXXXXXX1212' AND ( STATUS = 1 OR STATUS = 2 ) AND isRemoved = 0)服務端使用mybatis框架的QueryWrapper【query包裝器】來統(tǒng)計子設備,之前的查詢語法是這樣的:
public int method(String id, int isRemoved) {QueryWrapper queryWrapper = new QueryWrapper<>();queryWrapper.eq("id", id);queryWrapper.eq("status", DeviceConstant.DeviceStatus.WORK).or().eq("status", DeviceConstant.DeviceStatus.FAULT);return mapper.selectCount(queryWrapper);}但是生成出來的SQL語句是
SELECTcount(1) FROMtable_name WHERE( id = '679135XXXXXXX1212' AND STATUS = 1 OR STATUS = 2 AND isRemoved = 0);正如我們所知道的那樣,MySQL中的?and的優(yōu)先級高于or,因而,上面的SQL語句可以轉(zhuǎn)化為
SELECTcount(1) FROMtable_name WHERE( (id = 679135XXXXXXX1212 AND STATUS = 1 ) OR (STATUS = 1 AND isRemoved = 0) );于是,就違背了我們最初的SQL語句,自然查詢出來的有可能不對,導致統(tǒng)計的結(jié)果不對,因為這樣的SQL語句表明:查詢出設備Id等于‘679135XXXXXXX1212’且狀態(tài)等于1,或者所有未移除的設備的狀態(tài)等于2。
因此,mybatis的queryMapper的查詢語法需要修改,如下:
public int method(String id, int isRemoved) {QueryWrapper queryWrapper = new QueryWrapper<>();queryWrapper.eq("id", id);queryWrapper.and(wrapper -> wrapper.eq("status", DeviceConstant.DeviceStatus.WORK).or().eq("status", DeviceConstant.DeviceStatus.FAULT));return mapper.selectCount(queryWrapper);}這種方式生成的SQL語句如下
SELECTCOUNT( 1 ) FROMtable_name WHERE( id = ? AND ( ( STATUS = ? OR STATUS = ? ) ) AND isRemoved = ? )這樣的SQL才是我們想要的查詢語句。
這是一個很細節(jié)的語法,一旦不注意,就陷入了mybatis的陷阱中。mybatis本身沒有問題,本身是個優(yōu)秀的框架。
總結(jié)
以上是生活随笔為你收集整理的mybatis框架中的queryWrapper的or查询,联想到MySQL中and 和or的关系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 【大数据】如何用形象的比喻描述大数据的技
- 下一篇: 【操作】vue-markdown使用
