背景
在複雜項目中,可能會對數據表多個字段進行排序,不理解的話可結合需求看。
需求
現在有一張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>