You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:00:16