我对操纵ArrayList<HashMap<String, String>>
不太熟悉。在这个问题中,我想保存一个函数的返回ArrayList<HashMap<String, String>>
。但是,如果编码错误,我不知道天气。谁能帮我吗?
我已经检查了我的sql代码,它可以正常工作并返回我想要的东西。
List<HashMap<String, String>> ErrorList= new ArrayList<HashMap<String, String>>();
ErrorList = select("SELECT * FROM process_result WHERE (status = 'Error') AND (mailBefore = 'No');");
public List<HashMap<String, String>> select(String query) {
List<HashMap<String, String>> output = new ArrayList<HashMap<String, String>>();
HashMap<String, String> map = null;
Statement statement = null;
try {
statement = this.conn.createStatement();
ResultSet rs = statement.executeQuery(StringEscapeUtils.unescapeJava(query));
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
map = new HashMap<String, String>();
while (rs.next()) {
for (int i = 1; i <= columnCount; i++ ) {
map.put(rsmd.getColumnName(i), rs.getString(i));
}
output.add(map);
}
} catch (SQLException e) {
logger.error(e);
e.printStackTrace();
}
//System.out.print("This is select output:" + output);
return output;
}
代码没有正确保存选择函数的返回值。
答案 0 :(得分:1)
您将始终用相同的列名和数据覆盖同一map
实例中每一行的map
键,因此最终将获得来自最后一行的数据。 ResultSet
和map
列表中的output
只有一个条目
相反,为HashMap
中的每一行创建一个新的ResultSet
实例,并将map
添加到每一行的列表中:
while (rs.next()) {
map = new HashMap<>(); //create one new map for every row
for (int i = 1; i <= columnCount; i++ ) {
map.put(rsmd.getColumnName(i), rs.getString(i));
}
output.add(map);
}
我还建议将方法的签名更改为:
public List<Map<String, String>> select(String query)
因此,请勿将代码耦合到实现。
您还需要更改这些行:
List<Map<String, String>> output = new ArrayList<Map<String, String>>();
// do not have a dependency on a particular implementation of the Map API
Map<String, String> map = null;