mybatis實現多字段動態排序

背景

在複雜項目中,可能會對數據表多個字段進行排序,不理解的話可結合需求看。

需求

現在有一張User表

男同學先按age降序排序,後按height降序排序,最後按id升序排序
女同學先按age升序排序,後按weight降序排序,最後按id升序排序

不合理?現實可能就是這麼的不合理。

實現

  1. 排序對(字段名,排序類型)
    @Data
    public class SortFieldPair{
        private String fieldName;
        private String sortType;
    
        public SortFieldPair(String fieldName, String sortType) {
            this.fieldName = fieldName;
            this.sortType = sortType;
        }
    }
    
  2. 根據策略構建排序對
    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;
        }
    
  3. dao
    List<UseroVO>  queryListByParam(@Param("sortFieldList")List<SortFieldPair> sortFieldPairs, @Param("start") int start, @Param("limit") Integer limit);
    
  4. 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>
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章