【问题标题】:java convert resultset to a listjava将结果集转换为列表
【发布时间】:2018-10-08 01:07:36
【问题描述】:

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

 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 个特权。 有什么想法吗?

【问题讨论】:

  • 你需要坚持jdbc吗?使用 ORM 将为您完成这项工作。另外,您解决此问题的方式意味着您的代码取决于您的查询(规范 orderby),您考虑过吗?
  • @Laurent B:在项目的实际状态下使用 ORM 会出现问题,因为要做的更改很多。
  • 感谢大家对此的回答和讨论。我得到了它。我进行了更改并得到了预期的结果。
  • 不值得一票(+1)。这是一个非常正确地表达的问题,包含解决它所需的所有信息。

标签: java resultset


【解决方案1】:

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

所以替换:

 PrivList.clear();

作者:

 PrivList = new ArrayList<>();

【讨论】:

    【解决方案2】:

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

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

    &lt;-- cmets 显示的编辑。

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

    【讨论】:

      【解决方案3】:

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

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

      在这里为下一个用户进行权限初始化。

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

      【讨论】:

        【解决方案4】:
        • 据我所知,您从未将用户 ID 分配给 User 对象?
        • PrivList.clear(); 清除您刚刚分配给用户的列表。相反,正如 davidxxx 所说,创建一个新列表。
        • 正如 anchreg 所说,创建用户并将其添加到列表后,您需要以与第一次相同的方式初始化下一个用户。
        • 循环终止后,如果previousId 不是null(也就是说,根本没有处理任何用户权限),则需要为最后一个用户分配值并将其添加到列表中,方法与在循环中的最后一个 else 案例中。

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

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-09-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-02-04
            • 1970-01-01
            相关资源
            最近更新 更多