嗨需要保存结果集,因为键值对键是来自数据库的字符串并且具有多个对应于键值也来自数据库的值地图看起来像这张地图>
我的代码是:
它是结果集提取器:在此我迭代结果集并将其添加到映射中。
ResultSetExtractor resultExtractor = new ResultSetExtractor() {
public Object extractData(ResultSet rs) throws SQLException,
DataAccessException {
MyDataBean dataBean = new MyDataBean();
List<MyDataBean > myDataBeanList = new ArrayList<MyDataBean >();
Map<String, List<MyBean>> myMap = new HashMap<String, List<MyDataBean>>();
while (rs.next()) {
String propertyNumber = rs.getString("PROPERTY_NUMBER");
dataBean.setAccountNumber(rs.getLong("ACCOUNT_NUMBER"));
dataBean.setAmount(rs.getDouble("AMOUNT"));
myDataBeanList .add(dataBean);
myMap .put(propertyNumber, argusDataList);
}
return myMap ;
}
};
这是方法::: 在这里我正在触发查询并传递结果提取器。
@SuppressWarnings("unchecked")
public Map<String, List<MyDataBean>> getData()
throws DataAccessException, GeneralFailureException {
Map<String, List<MyDataBean>> myMap= null;
try {
myMap= jdbcTemplate.query(MyQuery,
resultExtractor );
} catch (DataAccessException ex) {
throw new GeneralFailureException("SQL Exception:xyzClass::"
+ ex);
} catch (Exception ex) {
throw new GeneralFailureException(
"GeneralFailureException::xyzClass::::" + ex);
}
return myMap;
}
在结果集提取器中,我在映射中保存数据,但在输出中它给出了映射的所有键,但只给出了添加到列表中的最后一个值 m 不明白为什么请帮我解决这个问题
提前致谢
我希望我能理解这一点。如果您有对应于该键的多个值,我建议按如下所示修改代码。在映射中,如果你尝试插入一个已经存在的键,它会替换旧的值。
public Object extractData(ResultSet rs) throws SQLException//, DataAccessException
{
MyDataBean dataBean = new MyDataBean();
List<MyDataBean > myDataBeanList = new ArrayList<MyDataBean >();
Map<String, List<MyDataBean>> myMap = new HashMap<String, List<MyDataBean>>();
while (rs.next()) {
String propertyNumber = rs.getString("PROPERTY_NUMBER");
dataBean.setAccountNumber(rs.getLong("ACCOUNT_NUMBER"));
dataBean.setAmount(rs.getDouble("AMOUNT"));
if (myMap.containsKey(propertyNumber) )
myMap .get(propertyNumber).add(dataBean);
else
{
myDataBeanList .add(dataBean);
myMap.put(propertyNumber, myDataBeanList) ;
}
}
return myMap ;
}
正确理解您的问题,您正在尝试将数据从ResultSet
中提取到从每个属性编号到其相应帐户信息列表的映射中。 因此,属性编号和帐户之间存在一对多关系。
我认为您只得到一个结果,因为当您调用myMap.put(propertyNumber, list)
而不是附加到现有列表时,您正在覆盖上一个属性编号的键。 如果你在 Javadoc 上查看 "put(key, value)" java.util.Map
,它解释了映射中任何与指定键匹配的现有键的值都将被新值替换。
因此,您需要使用如下方法检查地图中是否存在属性编号:
if (!myMap.containsKey(propertyNumber)) {
myMap.put(propertyNumber, new ArrayList<MyDataBean>());
}
List<MyDataBean> myDataBeanList = myMap.get(propertyNumber);
// continue constructing new MyDataBean using the current row of the ResultSet
我还认为您需要缩小myDataBean
变量的范围,使其位于while (rs.next())
循环内,以确保每个帐号和金额都有一个不同的实例。