最近在工作中遇到一个问题,就是我用querywrapper查询时参与的条件查询中,and和or会有个优先级执行,来看下面这串代码:

QueryWrapper<TGeHiddenInfo> query = new QueryWrapper<TGeHiddenInfo>();
        query.eq("STATE","待派发").or().eq("STATE","待排查");
        query.eq("TO_CHAR(OPEN_TIME,'yyyy-mm')",openTime);

这里我想要的业务逻辑是,判断待派发或者待排查的数据并且满足opentime对应的时间的数据,但是由于他们的优先级问题,and先被运算了,结果SQL的逻辑就变成这样:

SELECT * FROM XXXX WHERE (STATE = '待派发' OR STATE = '待排查' AND TO_CHAR(OPEN_TIME, 'yyyy-mm') = xxxx)

这样的话只命中了状态等于待派发的数据,显然就不符合理想数据

于是经过面向百度编程后发现很多人遇到了这个问题,也很好解决哈哈哈,只是细节问题!

幼儿园我们都学过,括号里的程式优先运算,SQL亦是如此!
代码稍微改变一下:

QueryWrapper<TGeHiddenInfo> query = new QueryWrapper<TGeHiddenInfo>();
        query.eq("TO_CHAR(OPEN_TIME,'yyyy-mm')",openTime);
        query.and(wrapper -> wrapper.eq("STATE","待派发").or().eq("STATE","待排查"));

结果生成出来的SQL:

SELECT  *  FROM XXXX (TO_CHAR(OPEN_TIME,'yyyy-mm') = ? AND (STATE = ? OR STATE = ?))

现在的数据就是正常的啦~!

最后修改:2022 年 06 月 06 日
如果觉得我的文章对你有用,请随意赞赏