根据 mybatis 根据多字段排序已经wrapper 根据多字段排序
首先根据咱们返回前端的数据列来规划好排序字段
如下:
这里的字段为返回VO的字段,要转换成数据库字段然后加入到排序中
示例,穿了 surname,cerRank 多字段,然后是倒序 false
首先创建好映射,如下代码,第一个List 为前端字段VO, 第二个List 为数据库字段。Util.handle 是将两个转换为map,然后就可以做映射啦。下面也写啦handle的方法。
Map<String,String>SORTCOLUMNMAP=Util.handle(Arrays.asList("surname","idcardNum","cerCode","cerType","cerRank","permissionTime","expirationTime"),Arrays.asList("surname","idcard_num","cer_code","cer_type","cer_rank","permission_time","expiration_time"));
/**
* 将两个list转换为Map
* @author ZMH
* @return Map<String, String>
*/publicstaticMap<String,String>handle(List<String> list1,List<String> list2){Map<String,String> map =IntStream.range(0, list1.size()).collect(HashMap::new,(m, i)-> m.put(list1.get(i), list2.get(i)),(m, n)->{});return map;}
到这里之后我们就做一个转换的方法吧,然后这里测试如下,结果为surname,cer_rank 成功的改为了数据库字段,然后就可以加入到wrapper和sql 中啦。
/**
* 获取转换后的排序字
* @author ZMH
* @date 31/7/2023 2:13 下午
*/publicstaticString getColumns (Map<String,String> sortColumnMap,String orderByColumns){List<String> orderByColumnList =Arrays.asList(orderByColumns.split(","));AtomicInteger i =newAtomicInteger();AtomicReference<String> columns =newAtomicReference<>("");
orderByColumnList.forEach(
column ->{
columns.set(columns.get()+sortColumnMap.get(column));if(i.getAndIncrement()!=(orderByColumnList.size()-1)){
columns.set(columns.get()+",");}});return columns.get();}
sql的话大家应该都知道怎么写,就不写sql的啦。写一个wrapper 的列子,如下:
queryCondition(queryWrapper,dto);//查询条件封装的方法都是一些判断if(StringUtils.isNotBlank(dto.getOrderByColumns())){String order = dto.getOrderByAsc()?"asc":"desc";//正序倒序 String columns =Util.getColumns(baseMapper.SORTCOLUMNMAP, dto.getOrderByColumns());//获取数据库字段
queryWrapper.last(" order by ".concat(columns).concat(" ").concat(order));//最后拼接到wrapper 里面就可以来啦.}else{
queryWrapper.orderByDesc(GzhExamCertificate::getCerCode);}
版权归原作者 只想早点下班 所有, 如有侵权,请联系我们删除。