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

实现映射含关联Manager的Employee集合的SetMapper时经理为null的解决方法

员工Manager映射为null的问题解决

你的代码核心问题出在结果集的遍历顺序上:如果某个员工的经理在结果集中的位置比该员工靠后,那么创建这个员工时,经理的实例还没被存入employeeMap,自然拿不到对应的Manager对象,导致manager字段为null。

解决思路分两步走:

  • 第一步:先创建所有员工实例,只填充基础信息(暂不设置manager),将所有实例存入map和集合。
  • 第二步:为每个员工匹配对应的manager实例。

修改后的代码如下:

public SetMapper<Set<Employee>> employeesSetMapper() {
    return resultSet -> {
        Set<Employee> employees = new HashSet<>();
        Map<BigInteger, Employee> employeeMap = new HashMap<>();
        // 额外存储员工与经理ID的对应关系,避免依赖ResultSet滚动
        Map<BigInteger, BigInteger> employeeToManagerIdMap = new HashMap<>();

        // 第一步:创建所有员工实例,记录经理ID
        while (resultSet.next()) {
            BigInteger id = BigInteger.valueOf(resultSet.getInt(1));
            FullName fullName = new FullName(resultSet.getString("firstName"), resultSet.getString("lastName"),
                    resultSet.getString("middleName"));
            Position position = Position.valueOf(resultSet.getString("position"));
            LocalDate hired = resultSet.getDate(7).toLocalDate();
            BigDecimal salary = resultSet.getBigDecimal("salary");
            BigInteger managerId = BigInteger.valueOf(resultSet.getInt(6));
            
            Employee employee = new Employee(id, fullName, position, hired, salary, null);
            employees.add(employee);
            employeeMap.put(id, employee);
            employeeToManagerIdMap.put(id, managerId);
        }

        // 第二步:为每个员工设置manager实例
        for (Map.Entry<BigInteger, BigInteger> entry : employeeToManagerIdMap.entrySet()) {
            BigInteger employeeId = entry.getKey();
            BigInteger managerId = entry.getValue();
            
            if (managerId != null && managerId.intValue() != 0) {
                Employee employee = employeeMap.get(employeeId);
                Employee manager = employeeMap.get(managerId);
                if (manager != null) {
                    employee.setManager(manager); // 需确保Employee类有setManager方法
                }
            }
        }

        return employees;
    };
}

注意事项:

  • 确保Employee类提供setManager方法,如果是不可变类,可在第二步重新创建带manager的实例替换集合和map中的对象。
  • 按需调整managerId的判断逻辑:比如部分数据库用0表示无经理,要根据实际业务场景过滤无效值。
  • 用employeeToManagerIdMap存储对应关系,无需依赖ResultSet的滚动能力,适配更多数据库驱动场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 10:42:43