如何用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
相关产品推荐
相关产品推荐

