实现映射含关联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
相关产品推荐
相关产品推荐

