前言

前端需要根据表头的点击控件可以排序,虽然前端能根据当前页的数据进行对应字段的排序,但也仅局限于实现当前页的排序,无法满足全部数据的排序,所以需要走接口的查询进行排序,获取最全的排序数据

实现方案

  1. 前端将排序的字段通过接口传入{"column":"dtCreateTime","order":"ASC"}
  2. 后端使用 mybatis-plus 的TableInfoHelper获取到字段映射的数据库字段
  3. 组装 order by 然后放置在LambdaQueryWrapper.last(orderSql)方法中

关键代码摘录

目前就简单考虑传入一个字段进行排序,多个可以使用逗号分隔等等,具体情况具体实现。

/**  
 * 根据查询条件拼接得到order by语句  
 * @param req 分页查询条件  
 * @return String  
 */
 public String getOrderByStatement(PageReq req) {  
    if (StringUtils.isNoneBlank(req.getColumn(), req.getOrder())) {  
        TableInfo tableInfo = TableInfoHelper.getTableInfo(EntityDemo.class);  
        List<TableFieldInfo> fieldList = tableInfo.getFieldList();  
        Optional<String> colum = fieldList.stream()  
                .filter(v -> StringUtils.equals(v.getEl(), req.getColumn()))  
                .findFirst()  
                .map(TableFieldInfo::getColumn);  
        if (colum.isPresent()) {  
            return String.format(" order by %s %s", colum.get(), req.getOrder());  
        }  
    }  
    return null;  
}

将上述的 order by 的 sql 放置在 LambdaQueryWrapper 生成的 sql 最后

String orderSql = getOrderByStatement(req);  
LambdaQueryWrapper<EntityDemo> queryWrapper = Wrappers.lambdaQuery(EntityDemo.class)  
        .查询条件 
        .last(StringUtils.isNotBlank(orderSql), orderSql);

总结

或许上面的方案不是比较好的方案,但是可以避免驼峰转换(数据库库区分字段大小写)和非表字段错误的情况。
上面并不是生产环境的代码,只是为了说明情况简化的代码。但核心还是TableInfoHelper,最后,祝各位玩的愉快。

Logo

一站式 AI 云服务平台

更多推荐