最近在工作中遇到一个问题,就是我用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 = ?))
现在的数据就是正常的啦~!