Spring jdbcTemplate 数据访问和java 算法

Spring jdbcTemplate data access and java algorithms

我有一种方法必须 return DAO 中的数据。

部门模型:

public class Department implements Serializable {
    private Long id;
    private String departmentName;
    private List<Employees> employeesInThisDepartment;
    // getters and setters...
}

员工模型:

public class Employees implements Serializable {

    private Long id;
    private String department;
    private String fullName;
    private Date birthday;
    private int salary;
    // getters and setters...
}

DAO 中的方法:

@Override
public Department findByDepartmentNameWithEmployees(String departmentName) {
    String sql = "select d.id, d.departmentName, e.id, e.fullName, e.department, e.birthday" +
            ", e.salary from department as d left join employees as e on d.departmentName = e.department " +
            "where lower(d.departmentName) = lower(:departmentName)";
    Map<String, Object> map = new HashMap<>();
    map.put("departmentName", departmentName);
    return jdbcTemplate.queryForObject(sql, map, (rs, rowNum) -> {
        Department department = new Department();
        department.setId(rs.getLong("department.id"));
        department.setDepartmentName(rs.getString("department.departmentName"));
        department.setEmployeesInThisDepartment(new ArrayList<>());

        while (rs.next()){
            Employees employees = new Employees();
            employees.setId(rs.getLong("employees.id"));
            employees.setFullName(rs.getString("employees.fullName"));
            employees.setDepartment(rs.getString("employees.department"));
            employees.setBirthday(rs.getDate("employees.birthday"));
            employees.setSalary(rs.getInt("employees.salary"));
            department.getEmployeesInThisDepartment().add(employees);
        }
        return department;
    });
}

此方法必须 return 一个部门,其中包含在该部门工作的所有员工的列表,但缺少列表中的第一个员工。 为什么会这样? (SQL 部分工作正常,我认为问题出在循环上?)

对,循环中的问题。根据docs:

Implementations must implement this method to map each row of data in the ResultSet.

所以你不需要调用rs.next(),只需删除这个循环包装器并移动块

    Department department = new Department();

    department.setEmployeesInThisDepartment(new ArrayList<>());

return jdbcTemplate.queryForObject(sql, map, (rs, rowNum) -> { ... } 之外。即:

Department department = new Department();
department.setEmployeesInThisDepartment(new ArrayList<>());

jdbcTemplate.queryForObject(sql, map, (rs, rowNum) -> {
        department.setId(rs.getLong("department.id"));
        department.setDepartmentName(rs.getString("department.departmentName"));

        Employees employees = new Employees();
        employees.setId(rs.getLong("employees.id"));
        employees.setFullName(rs.getString("employees.fullName"));
        employees.setDepartment(rs.getString("employees.department"));
        employees.setBirthday(rs.getDate("employees.birthday"));
        employees.setSalary(rs.getInt("employees.salary"));
        department.getEmployeesInThisDepartment().add(employees);
});
return department;