java 将结果集转换为列表
java convert resultset to a list
我想将我的结果集转换为对象列表。这是我的查询:
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
我有一个 class 用户定义如下:
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 个权限。
有什么想法吗?
所有 User
对象引用同一对象 List
权限,因为您没有为每个用户创建新实例。相反,您只清除列表。
因此,所有用户都设置有 2 个权限,因为您处理的最后一个用户有 2 个权限。
所以替换:
PrivList.clear();
作者:
PrivList = new ArrayList<>();
您需要为每个用户创建一个 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;
}
}
那是因为你在这里错过了新用户的第一个特权,
else {
user.setUserPrivilege(PrivList);
allUserList.add(user);
PrivList.clear();
previousId=null;
}
这里为下一个用户做权限初始化。
PrivList = new ArrayList<>();
PrivList.add(privilege);
- 据我所知,您从未将用户 ID 分配给
User
对象?
PrivList.clear();
清除您刚刚分配给用户的列表。而是创建一个新列表,正如 davidxxx 所说。
- 正如anchreg所说,创建用户并将其添加到列表后,您需要按照与第一次相同的方式初始化下一个用户。
- 循环终止后,如果
previousId
不是 null
(也就是说,根本没有处理任何用户特权),则需要为最后一个用户分配值并将其添加到以与循环中最后一个 else
案例相同的方式列出。
所有这些都表明可以使用流编码更优雅的解决方案。
在我看来,我认为这不是一个好的模型。您应该有第二个 table 具有与用户相关的权限。但要解决你的问题:
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);
}
我想将我的结果集转换为对象列表。这是我的查询:
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
我有一个 class 用户定义如下:
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 个权限。 有什么想法吗?
所有 User
对象引用同一对象 List
权限,因为您没有为每个用户创建新实例。相反,您只清除列表。
因此,所有用户都设置有 2 个权限,因为您处理的最后一个用户有 2 个权限。
所以替换:
PrivList.clear();
作者:
PrivList = new ArrayList<>();
您需要为每个用户创建一个 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;
}
}
那是因为你在这里错过了新用户的第一个特权,
else {
user.setUserPrivilege(PrivList);
allUserList.add(user);
PrivList.clear();
previousId=null;
}
这里为下一个用户做权限初始化。
PrivList = new ArrayList<>();
PrivList.add(privilege);
- 据我所知,您从未将用户 ID 分配给
User
对象? PrivList.clear();
清除您刚刚分配给用户的列表。而是创建一个新列表,正如 davidxxx 所说。- 正如anchreg所说,创建用户并将其添加到列表后,您需要按照与第一次相同的方式初始化下一个用户。
- 循环终止后,如果
previousId
不是null
(也就是说,根本没有处理任何用户特权),则需要为最后一个用户分配值并将其添加到以与循环中最后一个else
案例相同的方式列出。
所有这些都表明可以使用流编码更优雅的解决方案。
在我看来,我认为这不是一个好的模型。您应该有第二个 table 具有与用户相关的权限。但要解决你的问题:
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);
}