我想将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个权限。 有什么想法吗?
答案 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)
User
对象?PrivList.clear();
清除您刚刚分配给用户的列表。而是创建一个新列表,正如davidxxx也说的那样。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);
}