У меня есть один метод, который должен возвращать данные в DAO.Spring jdbcTemplate data access и java algorithm
модель Факультет:
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-часть работает правильно, я думаю, что проблема связана с циклом?)
Не называть 'rs.next()' ... Метод 'mapRow' (который используется) вызывается для каждой строки в наборе результатов. В основном вы работаете, а не с каркасом. Каждая строка в наборе результатов будет содержать всю информацию отдела и информацию о 1 сотруднике, теперь вы всегда пропускаете первый. Вы должны использовать 'ResultSetExtractor' вместо' RowMapper'. –