Ява конвертировать набор результатов в список - PullRequest
0 голосов
/ 27 апреля 2018

Я хочу преобразовать свой 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 будет иметь 2 привилегии, отличные от 3. Есть идеи?

Ответы [ 5 ]

0 голосов
/ 27 апреля 2018

Я думаю, что это не очень хорошая модель. У вас должна быть вторая таблица с привилегиями, связанными с пользователем. Но чтобы решить ваш вопрос:

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);
}
0 голосов
/ 27 апреля 2018
  • Насколько я понимаю, вы никогда не назначаете идентификатор пользователя для объекта User?
  • PrivList.clear(); очищает список, который вы только что присвоили пользователю. Вместо этого создайте новый список, как также сказал davidxxx.
  • Как сказал anchreg, после того, как вы создали пользователя и добавили его в список, вам нужно инициализировать следующего пользователя так же, как вы делали это в первый раз.
  • После завершения вашего цикла, если previousId не null (то есть, какое-либо преимущество пользователя было обработано вообще), вам необходимо присвоить значения последнему пользователю и добавить его в список так же, как в последнем else случае в цикле.

Все это говорит о том, что более элегантное решение может быть закодировано с использованием потоков.

0 голосов
/ 27 апреля 2018

Вам необходимо создать новый экземпляр 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;
    }
}
0 голосов
/ 27 апреля 2018

Это потому, что вы пропустили первую привилегию нового пользователя здесь,

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

Выполните инициализацию привилегий для следующего пользователя здесь.

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

0 голосов
/ 27 апреля 2018

Все User объекты ссылаются на один и тот же объект List привилегий, поскольку вы не создаете новый экземпляр для каждого пользователя. Вместо этого вы очищаете только список.
Следовательно, все пользователи имеют 2 привилегии, поскольку последний пользователь, с которым вы работаете, имеет 2 привилегии.

Так замените:

 PrivList.clear();

по:

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