是从数据库中查出记录,然后存到一个HashMap组成的List中,数据库字段是不可能重复的,但是通过断点跟踪发现,某些前面取出的键被覆盖了,代码如下:
public static List executeQuery(String sql) throws Exception {
System.out.println(sql);
List rsall = new ArrayList();
Connection con = connectToDb();
Statement stmt = null;
ResultSet rs = null;
Map rsTree;
try {
stmt = con.createStatement();
rs = stmt.executeQuery(sql);
ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();
while (rs.next()) {
rsTree = new HashMap(numberOfColumns);
for (int r = 1; r < numberOfColumns + 1; r++) {
rsTree.put(rsmd.getColumnName(r).toLowerCase(), rs.getObject(r)); }
rsall.add(rsTree);
}
} catch (Exception ex) {
ex.printStackTrace();
} finally {
try {
rs.close();
stmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return rsall; }

解决方案 »

  1.   

    while (rs.next()) {
    rsTree = new HashMap(numberOfColumns);
    for (int r = 1; r < numberOfColumns + 1; r++) {
    rsTree.put(rsmd.getColumnName(r).toLowerCase(), rs.getObject(r)); }
    rsall.add(rsTree);
    }
    lz每次循环的时候rsTree = new HashMap(numberOfColumns);new了一个新的hashMap,等你循环出来肯定没有前面的数据啦!
      

  2.   

    是的,我从debug中看那个HashMap对象中的size,table属性,
    size等于7,但table只有5项有内容,跟踪发现,前面的某些项被覆盖了
      

  3.   

    harston() ,我是跟踪看的,没有退出while循环,在for循环的时候,前5项都没有问题,但是在第六项执行put时,前5项中的某一项被覆盖了
      

  4.   

    不好意思我看错了!rsTree.put(rsmd.getColumnName(r).toLowerCase(), rs.getObject(r));是不是因为rsmd.getColumnName(r)获取的是列名而不是数据的原因哦,如果列名相同的话肯定会被覆盖了阿,你调试的时候看看这个数据是不是每次都一样三
      

  5.   

    harston() 
    “如果列名相同的话肯定会被覆盖了阿”
    列名是不同的,而且这个函数原来使用没有问题,今天突然发现有些列取不到数据
      

  6.   

    今天咋尽出歪主意阿,呵呵,
    你的sql语句是什么啊?
      

  7.   

    搂主大意了问题是这样的:table的每一项下还有个next hashmap hashtable都是有个hash算法 如果hash值一致 就占用一个位置 只是用一个链接连接了起来不是么~
      

  8.   

    每次rs.next()列名是相同的,也就是key相同前面的就被覆盖了