我有一个关于 Java 中向下转型的问题:
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
这里i
代表行的索引(结果集中会有一行或多行)
最佳答案
有多种方法可以做到这一点,但我会选择其中两种。
首先直接返回
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; }
关于java - List<Object> 和 SqlRowSet 向下转型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37313600/