Spring jdbcTemplate数据访问和java算法

时间:2016-09-05 07:17:29

标签: java sql spring jdbc jdbctemplate

我有一个必须在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;
    });
}

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

1 个答案:

答案 0 :(得分:1)

对,循环中的问题。根据{{​​3}}:

  

实现必须实现此方法来映射每行数据   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;