You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java的Map/Enum优化if-else实现SQL排序逻辑

用Map或Enum替代if-else优化SQL排序逻辑

我是Java新手,想通过Java集合的Map或者Enum替换代码里的大量if-else,优化SQL排序逻辑。原if-else代码能正常生成排序语句(注:原代码里有拼写错误,ORDDER应该改成ORDER),但我自己写的Map实现没法正常运行,求指导怎么用Map或Enum写出和原if-else等价的功能。

原if-else代码

private List<Item> getBussinessSearchItem(IteamSearch itemSearch, byte searchType,int size, int offSet){
        StringBuilder queryBuilder = new StringBuilder();
        
        if(itemSearch.getOrigin()!=null && (checkOriginDomain(itemSearch.getOrigin()))) {
            if(itemSearch.getSort().equalsIgnoreCase("name")) {
                if(itemSearch.getSortOrder() == 1) {
                    queryBuilder.append("ORDDER BY Name ASc");
                }else {
                    queryBuilder.append("ORDDER BY Name ASc");
                }
            }else if(itemSearch.getSort().equalsIgnoreCase("upc1")) {
                if(itemSearch.getSortOrder() == 1) {
                    queryBuilder.append("ORDDER BY upc1 ASc");
                }else {
                    queryBuilder.append("ORDDER BY upc1 ASc");
                }
            }
            else if(itemSearch.getSort().equalsIgnoreCase("minQuantiy")) {
                if(itemSearch.getSortOrder() == 1) {
                    queryBuilder.append("ORDDER BY minQuantiy ASc");
                }else {
                    queryBuilder.append("ORDDER BY minQuantiy ASc");
                }
            }
        }
        // 省略后续执行查询的代码
}

错误的Map实现代码

private Map<String , String> getBussinessSearchItem(ItemSearch itemSearch){
        Map<String,String> newMap = new HashMap<>();
        itemSearch.getSort().equalsIgnoreCase("name");
        itemSearch.getSort().equalsIgnoreCase("upc1");
        itemSearch.getSort().equalsIgnoreCase("minQuantiy");
        // 无返回值,未处理排序拼接逻辑
}

解决方案

方案一:使用Map实现

通过Map存储排序字段与数据库列名的映射,统一处理大小写问题,避免重复if判断:

private List<Item> getBussinessSearchItem(ItemSearch itemSearch, byte searchType, int size, int offSet) {
    StringBuilder queryBuilder = new StringBuilder();
    
    // 初始化排序字段(小写)到数据库列名的映射
    Map<String, String> sortColumnMap = new HashMap<>();
    sortColumnMap.put("name", "Name");
    sortColumnMap.put("upc1", "upc1");
    sortColumnMap.put("minquantiy", "minQuantiy");

    if (itemSearch.getOrigin() != null && checkOriginDomain(itemSearch.getOrigin())) {
        String sortKey = itemSearch.getSort() != null ? itemSearch.getSort().toLowerCase() : "";
        // 校验当前排序字段是否在映射范围内
        if (sortColumnMap.containsKey(sortKey)) {
            String columnName = sortColumnMap.get(sortKey);
            // 保留原逻辑:无论sortOrder值如何都用ASC,需区分升降序可修改此处判断
            String orderDir = itemSearch.getSortOrder() == 1 ? "ASC" : "ASC";
            // 修正拼写错误:ORDDER → ORDER
            queryBuilder.append("ORDER BY ").append(columnName).append(" ").append(orderDir);
        }
    }
    
    // 省略后续执行查询、返回结果的代码
    return Collections.emptyList();
}

方案二:使用Enum实现

Enum适合固定枚举场景,可将排序字段、列名、逻辑封装在一起,可读性更强:
首先定义枚举类:

enum SortField {
    NAME("name", "Name"),
    UPC1("upc1", "upc1"),
    MIN_QUANTITY("minquantiy", "minQuantiy");

    private final String paramName; // 前端传入的排序参数(小写)
    private final String columnName; // 数据库列名

    SortField(String paramName, String columnName) {
        this.paramName = paramName;
        this.columnName = columnName;
    }

    // 根据参数值匹配对应的枚举
    public static SortField fromParam(String param) {
        if (param == null) {
            return null;
        }
        String lowerParam = param.toLowerCase();
        for (SortField field : values()) {
            if (field.paramName.equals(lowerParam)) {
                return field;
            }
        }
        return null;
    }

    public String getColumnName() {
        return columnName;
    }
}

然后修改业务方法:

private List<Item> getBussinessSearchItem(ItemSearch itemSearch, byte searchType, int size, int offSet) {
    StringBuilder queryBuilder = new StringBuilder();
    
    if (itemSearch.getOrigin() != null && checkOriginDomain(itemSearch.getOrigin())) {
        SortField sortField = SortField.fromParam(itemSearch.getSort());
        if (sortField != null) {
            String orderDir = itemSearch.getSortOrder() == 1 ? "ASC" : "ASC"; // 保留原逻辑,需区分升降序可修改
            queryBuilder.append("ORDER BY ").append(sortField.getColumnName()).append(" ").append(orderDir);
        }
    }
    
    // 省略后续执行查询、返回结果的代码
    return Collections.emptyList();
}

内容的提问来源于stack exchange,提问作者Mama

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 00:31:07