EntityWrapper添加括号方法,orNew()、andNew()不满足要求时

背景:使用EntityWrapper进行sql语句拼接时,遇到查询or条件,而且是多个,但orNew()方法并不能满足我的需求,也没找到什么合适的方法。

//目标sql语句 A and (B or C or D)
/*SELECT * FROM user_info   
WHERE  (ID = ? 
AND ((START_TIME >= ? AND END_TIME <= ?)  
OR (START_TIME <= ? AND END_TIME >= ?)  
OR (START_TIME <= ? AND END_TIME <= ? AND END_TIME >= ?)  
OR (START_TIME >= ? AND END_TIME >= ? AND START_TIME <= ?))
)*/

//错误代码
entityWrapper = new EntityWrapper<>();
                entityWrapper.eq("ID",satCasePqReal.getPqId());
                entityWrapper.andNew().ge("START_TIME",satCourtCasePqReqDTO.getStartTime()).le("END_TIME",satCourtCasePqReqDTO.getEndTime())
                        .orNew().le("START_TIME",satCourtCasePqReqDTO.getEndTime()).ge("END_TIME",satCourtCasePqReqDTO.getStartTime())
                        .orNew().le("START_TIME",satCourtCasePqReqDTO.getEndTime()).le("END_TIME",satCourtCasePqReqDTO.getStartTime()).ge("END_TIME",satCourtCasePqReqDTO.getStartTime())
                        .orNew().ge("START_TIME",satCourtCasePqReqDTO.getEndTime()).ge("END_TIME",satCourtCasePqReqDTO.getStartTime()).le("START_TIME",satCourtCasePqReqDTO.getEndTime());
/*最终sql语句:条件变成了 A and B or C or D,完全不符合我的需求
SELECT * FROM user_info   
WHERE  (ID = ? 
and (START_TIME >= ? AND END_TIME <= ?)  
OR (START_TIME <= ? AND END_TIME >= ?)  
OR (START_TIME <= ? AND END_TIME <= ? AND END_TIME >= ?)  
OR (START_TIME >= ? AND END_TIME >= ? AND START_TIME <= ?)
)
*/

//动了点小脑筋,不知道有没有更好的方法
entityWrapper = new EntityWrapper<>();
                entityWrapper.eq("ID",satCasePqReal.getPqId());
                entityWrapper.addFilter("((1<>1");
                entityWrapper.orNew().ge("START_TIME",satCourtCasePqReqDTO.getStartTime()).le("END_TIME",satCourtCasePqReqDTO.getEndTime())
                        .orNew().le("START_TIME",satCourtCasePqReqDTO.getEndTime()).ge("END_TIME",satCourtCasePqReqDTO.getStartTime())
                        .orNew().le("START_TIME",satCourtCasePqReqDTO.getEndTime()).le("END_TIME",satCourtCasePqReqDTO.getStartTime()).ge("END_TIME",satCourtCasePqReqDTO.getStartTime())
                        .orNew().ge("START_TIME",satCourtCasePqReqDTO.getEndTime()).ge("END_TIME",satCourtCasePqReqDTO.getStartTime()).le("START_TIME",satCourtCasePqReqDTO.getEndTime());
                entityWrapper.addFilter("1=1))");
/*最终结果:A and (1<>1 or B or C or D),勉强符合我的需求
SELECT * FROM user_info   
WHERE  (ID = ? 
AND ((1<>1)  
OR (START_TIME >= ? AND END_TIME <= ?)  
OR (START_TIME <= ? AND END_TIME >= ?)  
OR (START_TIME <= ? AND END_TIME <= ? AND END_TIME >= ?)  
OR (START_TIME >= ? AND END_TIME >= ? AND START_TIME <= ? AND 1=1))
)
*/

最后,如果大家有更好的方法,麻烦请告诉我,蟹蟹~

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值