2016-09-05 2 views
0

У меня есть один метод, который должен возвращать данные в 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-часть работает правильно, я думаю, что проблема связана с циклом?)

+3

Не называть 'rs.next()' ... Метод 'mapRow' (который используется) вызывается для каждой строки в наборе результатов. В основном вы работаете, а не с каркасом. Каждая строка в наборе результатов будет содержать всю информацию отдела и информацию о 1 сотруднике, теперь вы всегда пропускаете первый. Вы должны использовать 'ResultSetExtractor' вместо' RowMapper'. –

ответ

1

Справа, проблема в цикле. В соответствии с docs:

Реализация должна реализовать этот метод для отображения каждой строки данных в результирующего набора.

Так что вам не нужно вызывать rs.next(), просто удалите эту петлю обертку и Переместить блок

Department department = new Department(); 

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

вне return jdbcTemplate.queryForObject(sql, map, (rs, rowNum) -> { ... }. I.e .:

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; 
+0

отсутствует 'final' на' department' IMHO –

+0

Может быть не нужен в Java 8, поскольку он фактически окончательный. Но я написал этот код из ума без компилятора, поэтому я оставлю эту деталь для SO – Andremoniy

+1

Я узнал какую-то функцию java 8;) спасибо –