如何将Java ResultSet转换为包含权限列表的User对象列表?
解决ResultSet转User对象列表的问题
嘿,我来帮你搞定这个转换需求!你的场景是同一个用户ID对应多条权限记录,核心思路就是遍历ResultSet时跟踪当前用户,把相同ID的权限合并到同一个User对象的权限列表里,具体实现如下:
第一步:先完善你的User类
首先你的User类需要添加getter、setter和便捷方法,不然没法给私有字段赋值和操作权限列表:
public class User { private int userID; private List<String> userPrivilege; // 带参构造,初始化用户ID和空权限列表 public User(int userID) { this.userID = userID; this.userPrivilege = new ArrayList<>(); } // getter和setter public int getUserID() { return userID; } public void setUserID(int userID) { this.userID = userID; } public List<String> getUserPrivilege() { return userPrivilege; } public void setUserPrivilege(List<String> userPrivilege) { this.userPrivilege = userPrivilege; } // 便捷添加权限的方法 public void addPrivilege(String privilege) { this.userPrivilege.add(privilege); } }
第二步:实现ResultSet到User列表的转换逻辑
这是核心的转换代码,重点是遍历ResultSet时的状态跟踪,避免重复创建User对象:
public List<User> convertResultSetToUsers(ResultSet rs) throws SQLException { List<User> userList = new ArrayList<>(); User currentUser = null; while (rs.next()) { int userId = rs.getInt("userID"); String privilege = rs.getString("privilege"); // 如果当前无用户,或当前用户ID与结果集ID不一致,创建新用户 if (currentUser == null || currentUser.getUserID() != userId) { // 先把之前的用户存入列表(如果有的话) if (currentUser != null) { userList.add(currentUser); } // 初始化新用户 currentUser = new User(userId); } // 将当前权限添加到当前用户的权限列表 currentUser.addPrivilege(privilege); } // 别漏了!循环结束后,最后一个用户还没加入列表,手动补上 if (currentUser != null) { userList.add(currentUser); } return userList; }
关键细节说明
- 状态跟踪:用
currentUser变量记录正在处理的用户,每次ResultSet的userID变化时,就把之前的用户存入列表,再创建新用户。 - 权限合并:同一个userID的所有权限都会被追加到该用户的
userPrivilege列表,完美匹配你的查询结果结构。 - 资源提示:实际业务中,记得用try-with-resources语法自动关闭ResultSet、Statement和Connection这些JDBC资源,避免内存泄漏。
用你给出的查询结果测试,转换后得到的User列表会是:
- User(userID=1001, userPrivilege=[read, write, execute, delete])
- User(userID=1006, userPrivilege=[execute, read, write])
- User(userID=1007, userPrivilege=[read, write])
内容的提问来源于stack exchange,提问作者Alex2330
相关产品推荐
相关产品推荐

