簡體   English   中英

Java中的一對多ResultSet

[英]One to Many ResultSet In Java

我的員工數據是:-

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

有人可以修改它並幫助我在這里消除FOR循環的需要,並一次性獲取員工列表嗎? 我只想進行一次數據庫調用,我想根據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;
}           

我會使用地圖:

    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());

方法addSEPCODE將一個值添加到SEPCODE列表中。

注意,順便說一句,在完成語句后關閉語句是個好主意。

下面的代碼僅是一個建議,希望對您有所幫助。 請記住,這些代碼尚未經過測試。

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());
}    

只需修改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