JDBC 结果集到 java 具有列表成员的 POJO

JDBC resultset into java POJO with list member

我有两个查询和结果集,在下面的代码中我想展示一个特定的 userGroupCode 我有特定的 userPreferenceemployee 与之相关联。我已经编写了下面的代码来显示 userGroupCode 对象:

String query1= "SELECT ug.userGroupCode, ug.userGroupDesc, up.userPreference"
+ "FROM dbo.UserGroup_link ug INNER JOIN dbo.UserPreference up ON  ug.userGroupCode = up.userGroupCode";
用户组代码 userGroupDesc 用户偏好
A100 金融 孟买
A100 金融 班加罗尔
A200 供应链 钦奈
A201 营销 德里
A201 营销 加尔各答
A300 健康 印多尔
String query2= "SELECT ug.userGroupCode, ug.userGroupDesc, emp.employee_id,emp.name,emp.role"
+ "FROM dbo.UserGroup ug INNER JOIN dbo.employee emp ON  ug.userGroupCode = emp.userGroupCode";
用户组代码 userGroupDesc employee_id 姓名 角色
A100 金融 101 Foo1 开发人员
A100 金融 101 Foo1 团队负责人
A200 供应链 091 测试 1 经理
A201 营销 591 用户 1 分析师
A201 营销 1001 Boo1 Scrum 大师
A300 健康 1001 Boo1 开发人员

我有 class UserGroupMapping 喜欢:

public class UserGroupMapping {
    private String userGroupCode;
    private String userGroupCode;
    private List<String> userPreference;
    private List<Employee> emp;
    
    //getter and setter
}

Employee 的另一个 class 是:

public class Employee {
    private String employee_id;
    private String name;
    private List<String> role;
    
    //getter and setter
}

在我的存储过程 class 中,我在 jdbcTemplate.query();

的帮助下调用这些查询
String userCode = null; 
List<String> userPreferenceList = new ArrayList<>();
List<UserGroupMapping> userGroupMappingList = new ArrayList<>();
List<UserGroupMapping> userGroupMappingList1 = new ArrayList<>();
UserGroupMapping userGroupMapping = new UserGroupMapping();
List<Employee> employeeList = new ArrayList<>();
Employee emp = new Employee();
UserGroupMapping userGroupMapping1 = new UserGroupMapping();

jdbcTemplate.query(query1, (rs)->{

    String user_group_code = rs.getString("userGroupCode");
    String user_group_desc = rs.getString("userGroupDesc");
    String user_preference = rs.getString("userPreference");
    
    if(userCode == null){
        userGroupMapping.setUserGroupCode(user_group_code);
        userGroupMapping.setUserGroupDesc(user_group_desc);
        userPreferenceList.add(userPreference);
        userCode = user_group_code;
    } else if (userCode.equals(user_group_code)) {
        userPreferenceList.add(userPreference);
    } else {
        userGroupMapping.setUserPreference(userPreferenceList);
        userGroupMappingList.add(userGroupMapping);
        userPreferenceList = new ArrayList<>();
        userGroupMapping = new userGroupMapping();
        userGroupMapping.setUserGroupCode(user_group_code);
        userGroupMapping.setUserGroupDesc(user_group_desc);
        userPreferenceList.add(userPreference);
        userCode = user_group_code;
    }});
    userCode = null;
    userGroupMapping.setUserPreference(userPreferenceList);
    userGroupMappingList.add(userGroupMapping);
jdbcTemplate.query(query2, (rs)->{

String user_group_code = rs.getString("userGroupCode");
String user_group_desc = rs.getString("userGroupDesc");
String emp_id = rs.getString("employee_id");
String name = rs.getString("name");

if(userCode == null){
    userGroupMapping1.setUserGroupCode(user_group_code);
    userGroupMapping1.setUserGroupDesc(user_group_desc);
    emp.setId(employeeId);
    emp.setName(name);
    employeeList.add(emp);
    userCode = user_group_code;
} else if (userCode.equals(user_group_code)) {
    Employee emp = new Employee();
    emp.setId(employeeId);
    emp.setName(name);
    employeeList.add(emp);
} else {
    userGroupMapping1.setEmployee(employeeList);
    userGroupMappingList1.add(userGroupMapping1);
    employeeList = new ArrayList<>();
    userGroupMapping1 = new userGroupMapping();
    Employee emp = new Employee();
    userGroupMapping1.setUserGroupCode(user_group_code);
    userGroupMapping1.setUserGroupDesc(user_group_desc);
    emp.setId(employeeId);
    emp.setName(name);
    employeeList.add(emp);
    userCode = user_group_code;
}});
userGroupMapping1.setEmployee(employeeList);
userGroupMappingList1.add(userGroupMapping1);

    List<UserGroupMapping> ugList = Stream.concat(userGroupMappingList.stream, userGroupMappingList1.stream).distinct().collect(Collectors.toList())
return ugList;

问题是我希望我的输出像:

[
    {
        "userGroupCode" : "A100",
        "userGroupDesc" : "Finance",
        "userPreference": ["Mumbai","Bangalore"],
        "Employee"      : [
                            "employee_id" : "101",
                            "name"        : "Foo1",
                            "role"        : ["Developer","Team Lead"]
                          ]
    }
]

合并两个列表后,我得到以下输出:

[
    {
        "userGroupCode" : "A100",
        "userGroupDesc" : "Finance",
        "userPreference": ["Mumbai","Bangalore"],
        "Employee"      : []
    },
    {
        "userGroupCode" : "A100",
        "userGroupDesc" : "Finance",
        "userPreference": [],
        "Employee"      : [
                            "employee_id" : "101",
                            "name"        : "Foo1",
                            "role"        : []
                          ]
    }
]

谁能帮我做几件事:

  1. 如何将角色嵌入到 Employee 对象中。
  2. 如何根据 userGroupCode 和 userGroupDesc 合并 table。
  3. 我觉得代码没有优化性能,我该如何优化这段代码。

提前致谢。

欧拉,

可以使用Map以id为key,value为object(聚合成)进行分组。例如:

if(map.containes(key))
{
    get object from map and do Ops.
}
else
{
    1. Create new object
    2. Do set Ops on Object
    3. Add to map.
}

你基本上有2个解决方案,

  1. 编写一个查询,returns 所有结果都带有连接并在 java 中进行过滤,使用 2 个映射很容易实现(一个用于 UserGroup其他为 Employee.

  2. 编写查询并在查询本身中使用 list 聚合重复项。

SELECT ug.userGroupCode, ug.userGroupDesc, up.userPreference, emp.employee_id,emp.name,emp.role
FROM dbo.UserGroup_link ug
INNER JOIN dbo.UserPreference up ON  ug.userGroupCode = up.userGroupCode
INNER JOIN dbo.employee emp ON  ug.userGroupCode = emp.userGroupCode

然后使用 RowCallbackHandler 来实现你想要的(而不是 ResultSetExtractor.

Map<String, UserGroup> userGroups = new HashMap<>;
Map<Integer, Employee> employees = new HashMap<>;

jdbc.query(query, (rs) -> {

 String userGroupCode = rs.getString("userGroupCode"); 
 String emp_id = rs.getString("employee_id");
 
 UserGroupMapping ugm userGroups.computeIfAbsent(userGroupCode,  {
    UserGroupMapping ugm1 = new UserGroupMapping();
    ugm1.setUserGroupCode(userGroupCode);
    ugm1.setUserGroupDesc(rs.getString("userGroupDesc");
    ugm1.setUserPreference(new ArrayList<>());
    ugm1.getEmployee(new ArrayList<>());
    return ugm1;
 });
 ugm.getUserPreference().add(rs.getString("userPreference"));

 Employee emp = employees.computeIfAbsent(emp_id, {
   Employee emp1 = new Employee();
   emp1.setName(rs.getString("name"));
   emp1.setRole(new ArrayList<>());
   ugm.getEmployee().add(emp);
   return emp1;
 });

 emp.getRole().add(rs.getString("role"));

});

return userGroups.values();

以上代码将从结果中获取所有 UserGroupMapping 个对象,包括所有 Employee 个实例。需要临时地图来确定记录是否已经显示。

另一种解决方案是在您的查询中使用 list 和一些 GROUP BY 语句让查询进行部分聚合。这样你可以更容易地创建一个 Employee.