方式一:前台传参为数组,后台SQ查询案例:
一般为多选场景:查询;
举例如下:
传值:“status” : [“保存”,“关闭”],
不传值:“status”: [],
传给后台:
控制层:
@PostMapping(value = "/getList")
@AuthInterceptor("mcg:getxxx:getList")
public Result getList(HttpServletRequest request,@RequestBody String param) {
try {
Map<String, Object> paramMap = JsonUtils.readValue(param, Map.class);
return Result.success().result(xxxService.getList(request,paramMap));
} catch (Exception e) {
log.error("XxxListController getList is error===:" + e.getMessage(), e);
return Result.failure("查询失败");
}
}
Mapper.xml层:
<!-- status:传数组 -->
<if test = "null != status and status.size > 0">
and status in
<foreach collection="status" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
疑问:
按理来说:前台传入的status 为数组类型,SQ 中if条件判断应该是:and status.length > 0,但是这样会报错,
所以最后选择:and status.size> 0;
欢迎给位大佬指点迷津!
方式二:前台传参为拼接字符串,后台SQ查询案例:
举例如下:
传值:“status”: “保存,关闭”,
不传值:“status”: “”,
后台需要针对拼接的字符串做拆分;如:参数通过英文逗号“,”拼接;
如下代码:
// 字符串转数组
private List<String> getSplitList(String par){
List<String> list = new ArrayList<>();
if("" != par){
String[] arr = par.split(","); // 根据英文逗号拆分
for (int i = 0; i < arr.length; i++) {
list.add(arr[i]);
}
}
return list;
}
public PageInfo<Map<String, Object>> getList(Map<String, Object> paramMap) {
List<String> statusList = getSplitList(String.valueOf(paramMap.get("status")));
paramMap.put("statusList",statusList);
List<Map<String, Object>> result = xxxListMapper.getList(paramMap); // 表单查询数据
}
<!-- status:传集合 -->
<if test = "null != statusList and statusList.size > 0">
and status in
<foreach collection="statusList" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
总结:以上两种方式都可以解决多条件查询场景需求;