前言
前端需要根据表头的点击控件可以排序,虽然前端能根据当前页的数据进行对应字段的排序,但也仅局限于实现当前页的排序,无法满足全部数据的排序,所以需要走接口的查询进行排序,获取最全的排序数据
实现方案
- 前端将排序的字段通过接口传入
{"column":"dtCreateTime","order":"ASC"}
- 后端使用 mybatis-plus 的
TableInfoHelper
获取到字段映射的数据库字段 - 组装 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
,最后,祝各位玩的愉快。