基于Java中的变量值的按类分组构造函数结果

时间:2019-07-18 08:57:08

标签: java arraylist hashmap

我有一个查询的结果集,希望以某种方式访问​​。

我想获取一份雇员列表,并为每位雇员一天不同的加班时间。 resulset返回值,例如:

empl_id,empl_name,超时时间,超时时间开始,超时时间结束。

我想在json中获得这些结果,但我想按员工ID对其进行分组,也就是说,我不希望这样:

empl_id = 125 
empl_name = Niki Smith
overtime_day = 18/7/2019
     overtime_start = 18:00
     overtime_end = 20:00 

empl_id = 125 
empl_name = Niki Smith
overtime_day = 18/7/2019
     overtime_start = 21:00
     overtime_end = 22:00 

我想要这样的东西:

empl_id = 125 
empl_name = Niki Smith
overtime_day = 18/7/2019
     overtime_start = 18:00
     overtime_end = 20:00 

     overtime_start = 21:00
     overtime_end = 22:00 

我有一个Employee类和一个构造函数

public Employee(String empl_id , String empl_name, String overtime_day,
            ArrayList<Overtime> overtimes)

以及带有String变量和getters / setter方法的类Overtime,用于overtime_start和overtime_end

我在处理集合或地图方面经验不足,因此,我将对如何构造这样的结果集的任何想法表示赞赏。谢谢。

2 个答案:

答案 0 :(得分:0)

由于要检索结果集的数据,这意味着您要检索关系模型,因此预期每次加班都会获得一行,因此不幸的是,您要查找的表示形式无法在关系模型中完成,因为最终,您将获得数据而不是对象的记录。

要解决您的问题,您有两种选择

  1. ORM模型,而不是在结果集中检索数据,您可以使用诸如hibernate之类的ORM框架将关系模型映射到Java模型,并让Java模型重新设置所需的输出(带有加班条目列表的雇员对象)。 / li>
  2. 手动处理它,一旦从结果集中检索数据,就创建一个具有雇员键ID和代表输出的value对象的映射,每次检索记录时,请检查该映射中的雇员ID(如果有)不存在时,添加一个新对象,如果存在,则将超时对象添加到雇员对象中的列表中。 像这样:

    Map<String, String> employeeMap = new LinkedHashMap<>();
    
    //Iterate over result set with rs
    while (rs.next()) { 
    {
         OverTime entry = new OverTime(rs.getString("start"), 
         rs.getString("end"));
         String id = rs.getString("id");
         if(!employeeMap.containsKey(id) {
            employeeMap.put(id, new Employee(id));
          }
        employeeMap.get(id).getOverTimeList.add(entry); 
    }
    

答案 1 :(得分:0)

您可以创建地图:Map<String, Employee> map //获取emp_id具有地图密钥

遍历结果集,检查emp_id是否存在于映射中。如果存在,则检索Employee对象。在ArrayList加班中添加加班详细信息。并放回地图上。

最后,您可以按map.values()

检索所有员工