日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mybatis框架中的queryWrapper的or查询,联想到MySQL中and 和or的关系

發(fā)布時間:2024/9/30 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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語句可以轉化為

SELECTcount(1) FROMtable_name WHERE( (id = 679135XXXXXXX1212 AND STATUS = 1 ) OR (STATUS = 1 AND isRemoved = 0) );

于是,就違背了我們最初的SQL語句,自然查詢出來的有可能不對,導致統(tǒng)計的結果不對,因為這樣的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)秀的框架。

總結

以上是生活随笔為你收集整理的mybatis框架中的queryWrapper的or查询,联想到MySQL中and 和or的关系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。