简体   繁体   English

Java中的一对多ResultSet

[英]One to Many ResultSet In Java

My employee data is:- 我的员工数据是:-

NAME | ID  | DEP_CODE
 AA   3679  SALES
 AA   3679  HR
 AA   3679  TECH
 AA   3679  MARKETTING
 BB   3604  HR
 BB   3604  SALES

Can someone revise it and help me to remove the need of FOR loop here and fetch list of employee in one go? 有人可以修改它并帮助我在这里消除FOR循环的需要,并一次性获取员工列表吗? I want to make DB call only once, I want to fetch DEP_CODE based on ID. 我只想进行一次数据库调用,我想根据ID提取DEP_CODE。

public List<Employee> fetchDistinctEmployee() {

    List<Employee> empList = new ArrayList<Employee>();
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("select distinct NAME, ID FROM Emp_Table");

        while (rs.next()) {
            Employee ep = new Employee();
            em.setNAME(rs.getString("NAME"));
            em.setID(rs.getInt("ID"));
            empList.add(em);
        }
        for (Employee emp : empList) {
            String sql1 = "SELECT DISTINCT DEP_CODE FROM Emp_Table WHERE id='" + emp.getID() + "'";
            ResultSet rs1 = stmt.executeQuery(sql1);
            ArrayList<String> list = new ArrayList<String>();
            while (rs1.next()) {
                list.add(rs1.getString("DEP_CODE"));
            }
            emp.setDEPCODE(list);
        }
    return empList;
}           

I would use a Map: 我会使用地图:

    Map<Integer,Employee> empMap = new LinkedHashMap<>();
    try (Statement stmt = conn.createStatement()) {
        ResultSet rs = stmt.executeQuery("select distinct NAME, ID, DEP_CODE FROM Emp_Table");

        while (rs.next()) {
            int id = rs.getInt("ID");
            Employee em = empMap.get(id);
            if (em == null) {
                em = new Employee();
                em.setID(id);
                em.setNAME(rs.getString("NAME"));
                em.setDEPCODE(new ArrayList<>()); // could be done in the constructor of Employee instead
                empMap.put(id, em);
            }
            em.addDEPCODE(rs.getString("DEP_CODE"));
        }
    }
    return new ArrayList<>(empMap.values());

Method addSEPCODE would add one value to the SEPCODE list. 方法addSEPCODE将一个值添加到SEPCODE列表中。

Note BTW that it's a good idea to close a statement when finished with it. 注意,顺便说一句,在完成语句后关闭语句是个好主意。

The code below is only a piece of advice, I hope it is helpful. 下面的代码仅是一个建议,希望对您有所帮助。 Remember these code haven't been tested. 请记住,这些代码尚未经过测试。

public List<Employee> fetchDistinctEmployee() {
    Map<String,Employee> empMap = new HashMap<String,Employee>();

    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery("select NAME, ID, DEP_CODE FROM Emp_Table");

    while (rs.next()) {
        String id = rs.getInt("ID");
        Employee ep = empMap.get(id);
        if(ep==null){
            ep = new Employee();
            empMap.put(id, ep);
            ep.setID(id);
            ep.setNAME(rs.getString("NAME"));
        }
        ep.getDEPCODE.add(rs.getString("DEP_CODE"));
    }
    return new ArrayList<Employee>(empMap.values());
}    

Just modifying OP's code and looping only once: 只需修改OP的代码并仅循环一次即可:

public List<Employee> fetchDistinctEmployee() {

        List<Employee> empList = new ArrayList<Employee>();
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery("select NAME, ID, DEP_CODE FROM Emp_Table sort by ID");

        Employee em = null ;
        while (rs.next()) {
            if(em == null || em.getID() != rs.getInt("ID")) {
                em = new Employee();
                em.setDEPCODE(new ArrayList<String>());
                empList.add(em);
            }
            em.setNAME(rs.getString("NAME"));
            em.setID(rs.getInt("ID"));
            em.getDEPCODE().add(rs.getString("DEP_CODE"));
        }
    return empList;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM