我正在尝试使用JDBCTemplate检索给定查询的地图列表。以下方法似乎适合我的用例:
public List<Map<String,Object>> queryForList(String sql)
throws DataAccessException
但是,我想确保对于给定的行,Map的顺序是有保证的。也就是说,LinkedHashMap会更好,因为我想保留列的顺序。有没有更好的方法来使用JDBCTemplate实现这一目标?
答案 0 :(得分:4)
我认为使用自定义ColumnMapRowMapper可以为每行创建一个LinkedHashMap,然后将其传递给查询方法:
&#xA;&#xA; &#xA;&#xA; RowMapper&lt; Map&lt; String,Object&gt;&gt; rowMapper = new ColumnMapRowMapper()&#xA; {&#XA; protected Map&lt; String,Object&gt; createColumnMap(int columnCount)&#xA; {&#XA;返回new LinkedHashMap&lt;&gt;(columnCount);&#xA; }&#XA; };&#XA;&#XA; JdbcTemplate jdbcTemplate = new JdbcTemplate();&#xA;&#xA; String sql =“SELECT ...”; &#XA;&#XA;尝试&#XA; {&#xA;列表与LT;地图; LT;字符串,对象&gt;&GT; results = jdbcTemplate.query(sql,rowMapper);&#xA; // ...&#xA; }&#XA; catch(DataAccessException e)&#xA; {&#XA; e.printStackTrace();&#XA; }&#XA; 代码>
&#XA;
答案 1 :(得分:0)
我自己发现这是很有趣的事实……如果您使用NamedParameterJdbcTemplate
,无论如何还是更好,默认情况下将确保列顺序。
例如,queryForList()方法最终创建了ColumnMapRowMapper():
@Override
public List<Map<String, Object>> queryForList(String sql, SqlParameterSource paramSource)
throws DataAccessException {
return query(sql, paramSource, new ColumnMapRowMapper());
}
在实现中使用了以下方法:
/**
* Create a Map instance to be used as column map.
* <p>By default, a linked case-insensitive Map will be created.
* @param columnCount the column count, to be used as initial
* capacity for the Map
* @return the new Map instance
* @see org.springframework.util.LinkedCaseInsensitiveMap
*/
protected Map<String, Object> createColumnMap(int columnCount) {
return new LinkedCaseInsensitiveMap<>(columnCount);
}
链接的哈希图将适当保留顺序。