我对Java中的向下转换有疑问:
@interface OParams : NSObject
-(int32_t)getParam1;
-(int32_t)getParam2;
-(void)setParam1:(int32_t)p;
-(void)setParam2:(int32_t)p;
@end
@interface ECMWrapper : NSObject
-(OParams*)getDeviceInfo;
@end
上面显示的代码将从数据库中检索记录并将其分配给名为List<Object> values = this.reportDao.retrieveRecord(ACCEPTABLE_DIFF_SQL, diff);
方法values
将循环遍历retrieveRecord()
,如下所示:
SqlRowSet
我的问题是:
如果我想让每一行中的每一列都存储在public List<Object> retrieveRecord(String sql, Object[] inputs) {
List<Object> list = new ArrayList<Object>();
SqlRowSet rset;
if (inputs.length == 0) {
rset = getJdbcTemplate().queryForRowSet(sql);
} else {
rset = getJdbcTemplate().queryForRowSet(sql, inputs);
}
int colCount = rset.getMetaData().getColumnCount();
if (rset.next()) {
for (int i = 1; i <= colCount; i++) {
list.add(rset.getObject(i));
}
}
return list;
}
中,我可以这样说:
values
此处SqlRowSet srs = (SqlRowSet) values.get(i);
String str = srs.getString(0); // get first column in the row set.
String str1 = srs.getString(1); // get second column in the row set
代表行的索引(我们将在结果集中包含一行或多行)
答案 0 :(得分:1)
有多种方法可以做到,但我会选择其中的两种。
首先直接返回SqlRowSet
而不是进行列表操作。直接使用getString获取调用者代码中的值。
稍长一点,但所有逻辑都会留在DAO本身:
代码示例:
public Map<Integer, Map<String, Object>> retrieveRecord(String sql, Object[] inputs) {
Map<Integer, Map<String, Object>> mapOfResults = new HashMap<Integer, Map<String, Object>>();
SqlRowSet rset;
if (inputs.length == 0) {
rset = getJdbcTemplate().queryForRowSet(sql);
} else {
rset = getJdbcTemplate().queryForRowSet(sql, inputs);
}
int colCount = rset.getMetaData().getColumnCount();
int rowIndex = 1;
while (rset.next()) {
Map<String, Object> columnValueMap = new HashMap<String, Object>();
for (int i = 1; i <= colCount; i++) {
columnValueMap.put(rset.getMetaData().getColumnLabel(i), rset.getObject(i));
}
mapOfResults.put(rowIndex, columnValueMap); //now you can access valueMap using index.
rowIndex++;
}
return mapOfResults;
}