有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将结果集转换为列表

我想将结果集转换为对象列表。这是我的疑问:

 String querystring1= "SELECT userID, privilege"
               + "FROM dbo.User order by userID, privilege";


 userID  privilege
 ------------------
 1001    read 
 1001   write
 1001   execute 
 1001   delete
 1006    execute 
 1006    read
 1006    write
 1007   read
 1007    write

我有一个类用户定义如下:

public class User {
   private int userID;
   private List<String> userPrivelege;
}

我想将其作为用户列表的输出,这是我实现的代码:

   String previousId = null;  
   List<String> PrivList= new ArrayList<String>();
   List<User> allUserList= new ArrayList<User>();

   while(result_set.next()) {
      String userID = result_set.getString("userID");
      String privilege = result_set.getString("privilege");
      if (previousId == null) { // first time
         User user = new User();
         PrivList.add(privilege);
         previousId=userID;
      } else if (previousId.equals(userID) {
         PrivList.add(privilege);
      } else {
         user.setUserPrivilege(PrivList);
         allUserList.add(user);
         PrivList.clear();
         previousId=null;
      }
   }

问题是,除了创建的第一个用户对象之外,所有下一个用户对象总是缺少第一个值,这意味着用户1006将拥有除3之外的2个权限。 知道吗


共 (5) 个答案

  1. # 1 楼答案

    所有User对象都引用相同的特权对象List,因为您不为每个用户创建新实例。相反,你只清除列表
    因此,所有用户都被设置为具有2个权限,因为您处理的最后一个用户具有2个权限

    因此,替换:

     PrivList.clear();
    

    作者:

     PrivList = new ArrayList<>();
    
  2. # 2 楼答案

    在我看来,我认为这不是一个好的模式。您应该有第二个具有与用户相关权限的表。但要解决你的问题:

    List<String> privList= new ArrayList<String>();
    Map<Integer, List<String>> hmUserPrivileges = HashMap<Integer, String>();
    
    while(result_set.next()) {
        int userID = result_set.getInt("userID");
        String privilege = result_set.getString("privilege");
    
        if (!hmUserPrivileges.contains(userID)) {
            privList= new ArrayList<String>();
        }
    
        privList.add(privilege);
        hmUserPrivileges.put(userID, privList);
    }
    
    List<User> allUserList = new ArrayList<User>();
    Iterator<Entry<Integer, List<String>>> iterator = hmUserPrivileges.entrySet().iterator();
    while(iterator.hasNext()) {
        Entry<Integer, List<String>> entry = iterator.next();
        User user = new User()
    
        user.setUserID(entry.getKey());
        user.setUserPrivelege(entry.getValue());
    
        allUserList.add(user);
    }
    
  3. # 3 楼答案

    您需要为每个用户创建一个PrivList的新实例

    此外,您需要为下一个用户添加权限,否则您会在循环中丢失该信息

    <--注释显示的编辑

    while(result_set.next()) {
        String userID = result_set.getString("userID");
        String privilege = result_set.getString("privilege");
        if (previousId == null) { // first time
            User user = new User();
            PrivList.add(privilege);
            previousId=userID;
        } else if (previousId.equals(userID) {
            PrivList.add(privilege);
        } else { 
            // nex user
            user.setUserPrivilege(PrivList);
            allUserList.add(user);
            PrivList = new ArrayList<>();  // <--
            PrivList.add(privilege);       // <--
            previousId=null;
        }
    }
    
  4. # 4 楼答案

    • 据我所知,您从未将用户ID分配给User对象
    • PrivList.clear();清除刚刚分配给用户的列表。而是创建一个新的列表,正如davidxxx所说
    • 正如anchreg所说,在创建了一个用户并将其添加到列表中之后,需要以与第一次相同的方式初始化下一个用户
    • 循环终止后,如果previousId不是null(也就是说,任何用户的previlege都已被处理),则需要将值分配给最后一个用户,并以与循环中最后一个else相同的方式将其添加到列表中

    所有这些都表明,可以使用流对更优雅的解决方案进行编码

  5. # 5 楼答案

    那是因为你错过了新用户的第一个特权

      else {
                 user.setUserPrivilege(PrivList);
                 allUserList.add(user);
                 PrivList.clear();
                 previousId=null;
        }
    

    在此处为下一个用户执行权限初始化

    PrivList = new ArrayList<>(); PrivList.add(privilege);