确保jdbctemplate中返回的列的顺序

时间:2017-07-21 01:25:57

标签: java spring jdbctemplate

我正在尝试使用JDBCTemplate检索给定查询的地图列表。以下方法似乎适合我的用例:

public List<Map<String,Object>> queryForList(String sql)
                                      throws DataAccessException

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/core/JdbcTemplate.html#queryForList-java.lang.String-

但是,我想确保对于给定的行,Map的顺序是有保证的。也就是说,LinkedHashMap会更好,因为我想保留列的顺序。有没有更好的方法来使用JDBCTemplate实现这一目标?

2 个答案:

答案 0 :(得分:4)

我认为使用自定义ColumnMapRowMapper可以为每行创建一个LinkedHashMap,然后将其传递给查询方法:

&#xA;&#xA;

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/core/JdbcTemplate.html#query-java.lang.String-org。 springframework.jdbc.core.RowMapper-

&#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);
    }

链接的哈希图将适当保留顺序。