java将结果集转换为列表

时间:2018-04-27 08:14:25

标签: java resultset

我想将Resultset转换为对象列表。这是我的问题:

 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 个答案:

答案 0 :(得分:2)

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

所以替换:

 PrivList.clear();

by:

 PrivList = new ArrayList<>();

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:2)

  • 据我所见,您永远不会将用户ID分配给User对象?
  • PrivList.clear();清除您刚刚分配给用户的列表。而是创建一个新列表,正如davidxxx也说的那样。
  • 正如anchreg所说,在创建用户并将其添加到列表后,您需要以与第一次相同的方式初始化下一个用户。
  • 循环终止后,如果previousId不是null(即根本没有处理任何用户优先权),则需要为最后一个用户分配值并将其添加到列表中与循环中的最后一个else情况相同。

所有这些都表示可以使用流编码更优雅的解决方案。

答案 3 :(得分:1)

您需要为每个用户创建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 :(得分:1)

我认为,这不是一个好模型。您应该拥有第二个表,其中包含与用户相关的权限。但要解决你的问题:

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);
}