Java 中返回参数按照请求参数进行排序
在开发接口的时候,有时候我们会遇到这样的场景,前端传来的参数是一个列表,我们通过这些参数在数据库中查询出一个列表,但是在数据库中查询出来的这个列表和前端传来的参数的顺序不一致。
比方说我们的数据库中 user 表有以下几条数据:
id | uid | name |
---|---|---|
1 | user_003 | 法半夏 |
2 | user_001 | 蜜远志 |
3 | user_002 | 麦冬 |
4 | user_004 | 茵陈 |
我们需要 通过前端传来的参数 uid 列表 查询 其中的数据,然后返回给前端,但是前端传来的 uid 列表是 [“user_001”, “user_002”, “user_003” ,“user_004”] ,这时候,我们通过
SELECT uid,`name` from user where uid
IN('user_001','user_002','user_003','user_004');
查询出来的结果是这样的:
id | uid | name |
---|---|---|
1 | user_003 | 法半夏 |
2 | user_001 | 蜜远志 |
3 | user_002 | 麦冬 |
4 | user_004 | 茵陈 |
即: 返回到前端的数据是这样的
[
{"name":"法半夏","uid":"user_003"},
{"name":"蜜远志","uid":"user_001"},
{"name":"麦冬","uid":"user_002"},
{"name":"茵陈","uid":"user_004"}
]
可以看到传入的参数列表和返回的列表 uid 并不是对应的。
我们希望的是返回 :
[
{"name":"蜜远志","uid":"user_001"},
{"name":"麦冬","uid":"user_002"},
{"name":"法半夏","uid":"user_003"},
{"name":"茵陈","uid":"user_004"}
]
为了解决这个问题,有多种方法,比方说在mybatis 中 先 使用 foreach 入参列表 再left join user 表, 但 这样的缺点是当参数列表较长的时候sql 语句可能很长,sql 语句解析可能会比较慢,占用网络带宽可能较大,总而言之就是可能存在 bug;
综上所述,我们采用在 java 代码中实现排序
不想打字了,直接上代码
排序工具类:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import java.lang.reflect.Field;
import java.util.*;
/**
* @author: XiaTian
* @create-time 18:22 2021/11/14
*/
public class OrderUtil {
private static Logger logger = LoggerFactory.getLogger(OrderUtil.class);
/**
* 排序操作
* @param originList 数据库中查询出来的的列表,需要排序操作
* @param orderList 前端传来的参数列表
* @param orderField 需要排序的字段, 如: uid
* @param <T> 泛型
* @return
*/
public static <T> List<T> order(List<T> originList,
List<String> orderList,
final String orderField){
if (CollectionUtils.isEmpty(originList)){
logger.info("入参集合为空");
return originList;
}
Map<String,T> tempMap = new HashMap<>();
Field declaredField;
List<T> rtnList = new ArrayList<>();
try {
declaredField = originList.get(0).getClass().getDeclaredField(orderField);
declaredField.setAccessible(true);
for (T ele : originList){
String value = declaredField.get(ele).toString();
tempMap.put(value,ele);
}
for (String code : orderList){
rtnList.add(tempMap.get(code));
}
} catch (NoSuchFieldException e) {
logger.warn("没用指定字段[{}]",orderField);
} catch (IllegalAccessException e) {
logger.warn("访问字段非法,请检查字段[{}]权限",orderField);
}
return rtnList;
}
public static void main(String[] args) {
List<String> orderList = Arrays.asList("user_001","user_002","user_003","user_004");
List<User> userList = new ArrayList<>();
userList.add(new User(1,"user_003","法半夏"));
userList.add(new User(2,"user_001","蜜远志"));
userList.add(new User(3,"user_002","麦冬"));
userList.add(new User(4,"user_004","茵陈"));
List<User> orderedUsers = OrderUtil.order(userList, orderList, "uid");
System.out.println(orderedUsers);
}
}
user 类
package com.xhw.product.outman.util;
import lombok.Data;
/**
* @author: XiaTian
* @create-time 18:37 2021/11/14
*/
@Data
public class User {
private int id;
private String uid;
private String name;
public User(int id, String uid, String name) {
this.id = id;
this.uid = uid;
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", uid='" + uid + '\'' +
", name='" + name + '\'' +
'}';
}
}