mp中如何添加括号
6.1 业务实现
如何通过mp语句实现这种SQL
SELECT
count( 0 )
FROM
tc_order
WHERE
(
(
(order_type = ? AND order_status IN (?))
OR
(order_type = ? AND order_status IN (?))
OR
(order_type = ? AND order_status IN (?))
)
AND (app_id IN (?,?))
AND (created_date BETWEEN ? AND ?)
)
实现代码
QueryWrapper<TcOrderDO> queryWrapper = new QueryWrapper<>();
if (query.getOrderStatus() != null) {
OrderStatusQueryEnum orderStatusQueryEnum = OrderStatusQueryEnum.codeOf(Integer.parseInt(query.getOrderStatus()));
queryWrapper.and(wrapper -> {
for (QueryStatusMapDTO queryStatusMapDTO : orderStatusQueryEnum.getQueryStatusMap()) {
wrapper.or(wp -> wp.eq("order_type", queryStatusMapDTO.getOrderTypeCode())
.in("order_status", queryStatusMapDTO.getOrderTypeStatusCodes()));
}
});
}
queryWrapper.and(wp -> wp.in("app_id", "70f01e7xxxxxxxx", "aaaaaaaaa346c0"));
if (query.getUserId() != null) {
queryWrapper.and(wp -> wp.in("user_id", query.getUserId()));
}
if (query.getPlaceOrderData() != null) {
LocalDate placeOrderData = query.getPlaceOrderData();
LocalDateTime startTime = LocalDateTime.of(placeOrderData.getYear(), placeOrderData.getMonth(), placeOrderData.getDayOfMonth()
, 0, 0, 0);
LocalDateTime endTime = LocalDateTime.of(placeOrderData.getYear(), placeOrderData.getMonth(), placeOrderData.getDayOfMonth()
, 23, 59, 59);
queryWrapper.and(wp -> wp.between("created_date", startTime, endTime));
}
List<TcOrderDO> tcOrderDOS = this.getBaseMapper().selectList(queryWrapper);
6.2 详细解释
6.2.1想给循环语句外面套括号
//循环语句外加括号 + 内部语句加括号
queryWrapper.and(wrapper -> {
for (QueryStatusMapDTO queryStatusMapDTO : orderStatusQueryEnum.getQueryStatusMap()) {
wrapper.or(wp -> wp.eq("order_type", queryStatusMapDTO.getOrderTypeCode())
.in("order_status", queryStatusMapDTO.getOrderTypeStatusCodes()));
}
});
//简单版 循环语句外加括号
queryWrapper.and(wrapper -> {
for(String bm : list) {
wrapper.like("xxxxx", bm).or();
}
return wrapper;
});
6.2.2 实现 B or C => (B or C)
queryWrapperw.eq("pid", bid).or().eq("pid2",bid); //错误示范
打印结果:select * form litemall_business where deleted=0 and pid=1 or pid2=1
queryWrapperw.and(wrapper -> wrapper.eq("pid", bid).or().eq("pid2", bid)); //正确结果
打印结果:select * form litemall_business where deleted=0 and (pid=1 or pid2=1)
6.2.3 A or(C and D)
@GetMapping("/A_or_CandD")
public Object A_or_CandD() {
//SELECT id,name,age,sex FROM student WHERE (name = ? OR (name = ? AND age = ?))
List<Student> list =
studentService
.lambdaQuery()
.eq(Student::getName, "1")
.or(wp -> wp.eq(Student::getName, "1").eq(Student::getAge, 12))
.list();
return list;
6.2.4 (AandB)or(CandD)
@GetMapping("/AandB_or_CandD")
public Object AandB_or_CandD() {
// SELECT id,name,age,sex FROM student WHERE ((name = ? AND age = ?) OR (name = ? AND age = ?))
List<Student> list =
studentService
.lambdaQuery()
.and(wp -> wp.eq(Student::getName, "1").eq(Student::getAge, 12))
.or(wp -> wp.eq(Student::getName, "1").eq(Student::getAge, 12))
.list();
return list;
}