背景
在复杂项目中,可能会对数据表多个字段进行排序,不理解的话可结合需求看。
需求
现在有一张User表
男同学先按age降序排序,后按height降序排序,最后按id升序排序
女同学先按age升序排序,后按weight降序排序,最后按id升序排序
不合理?现实可能就是这么的不合理。
实现
- 排序对(字段名,排序类型)
@Data public class SortFieldPair{ private String fieldName; private String sortType; public SortFieldPair(String fieldName, String sortType) { this.fieldName = fieldName; this.sortType = sortType; } }
- 根据策略构建排序对
private List<SortFieldPair> buildUserSortList(UserSearchParam userSearchParam) { List<SortFieldPair> res = new ArrayList<>(); if(userSearchParam.getSex=="man"){ res.add(new SortFieldPair("age", SortOrder.DESC.toString())); res.add(new SortFieldPair("height", SortOrder.DESC.toString())); }else if (userSearchParam.getSex=="woman") { res.add(new SortFieldPair("age", SortOrder.ASC.toString())); res.add(new SortFieldPair("weight", SortOrder.DESC.toString())); } res.add(new SortFieldPair("id", SortOrder.ASC.toString())); return res; }
- dao
List<UseroVO> queryListByParam(@Param("sortFieldList")List<SortFieldPair> sortFieldPairs, @Param("start") int start, @Param("limit") Integer limit);
- mapper
注意使用的是${},#{}会为表字段加 '' 变为字符串,(eg. name => 'name' ),导致失效。具体可看: https://blog.csdn.net/LitongZero/article/details/83753327
<select id="queryListByParam" resultType="com.tao.vo.result.UserVO"> select * FROM sys_user WHERE is_del=0 <foreach collection="sortFieldList" item="sortField" open="order by " separator="," close=" "> ${sortField.fieldName} ${sortField.sortType} </foreach> LIMIT #{limit} OFFSET #{start} </select>