mybatis实现多字段动态排序

发布时间 2023-09-20 14:56:06作者: 帅气的涛啊

背景

在复杂项目中,可能会对数据表多个字段进行排序,不理解的话可结合需求看。

需求

现在有一张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>