如何使用JDBCTemplate.queryForMap获取Map数据

use*_*214 34 java spring jdbctemplate

如何从中加载数据JDBCTemplate.queryForMap()并返回Map接口.如何在map内部维护查询数据.我试图加载但是我得到了以下异常,即org.springframework.dao.IncorrectResultSizeDataAccessException:结果不正确

码:-

public List getUserInfoByAlll() {
    List profilelist=new ArrayList();
    Map m=new HashMap();
    m=this.jdbctemplate.queryForMap("SELECT userid,username  FROM USER");
    Set s=m.keySet();
    Iterator it=s.iterator();
    while(it.hasNext()){
        String its=(String)it.next();
        Object ob=(Object)m.get(its);
        log.info("UserDAOImpl::getUserListSize()"+ob);
    }
    return profilelist;
}
Run Code Online (Sandbox Code Playgroud)

Plz帮助我

hvg*_*des 49

queryForMap如果你想获得一行是合适的.你选择没有where条款,所以你可能想要queryForList.该错误可能表示queryForMap需要一行,但您查询的是检索多行.

查看文档. 有一个queryForList只需要sql; 返回类型是

List<Map<String,Object>>.

所以一旦你得到了结果,你就可以做你正在做的事情.我会做点什么的

List results = template.queryForList(sql);

for (Map m : results){
   m.get('userid');
   m.get('username');
} 
Run Code Online (Sandbox Code Playgroud)

我会让你填写详细信息,但在这种情况下我不会迭代密钥.我喜欢明确我的期望.

如果您有一个User对象,并且您实际上想要加载User实例,则可以使用queryForList带有sql和类类型的对象

queryForList(String sql, Class<T> elementType)

(自从我离开Javaland以来,Spring已经发生了很大变化.)

  • 从文档中,queryForObject返回指定类的实例.queryForMap返回一个映射,其中每列都是值的键. (2认同)

小智 42

我知道这很老了,但这是查询Map的最简单方法.

只需实现ResultSetExtractor接口即可定义要返回的类型.以下是如何使用它的示例.您将手动映射它,但对于简单的映射,它应该是直截了当的.

jdbcTemplate.query("select string1,string2 from table where x=1", new ResultSetExtractor<Map>(){
    @Override
    public Map extractData(ResultSet rs) throws SQLException,DataAccessException {
        HashMap<String,String> mapRet= new HashMap<String,String>();
        while(rs.next()){
            mapRet.put(rs.getString("string1"),rs.getString("string2"));
        }
        return mapRet;
    }
});
Run Code Online (Sandbox Code Playgroud)

这将为您提供返回类型的Map,该Map具有多行(无论您的查询返回多少),而不是地图列表.您可以在此处查看ResultSetExtractor文档:http://docs.spring.io/spring-framework/docs/2.5.6/api/org/springframework/jdbc/core/ResultSetExtractor.html

  • 我更喜欢这个答案而不是选择的答案,更简单,需要的工作更少。 (2认同)

cs_*_*pil 18

要添加到@BrianBeech的答案,这在Java 8中更加严格:

jdbcTemplate.query("select string1,string2 from table where x=1", (ResultSet rs) -> {
    HashMap<String,String> results = new HashMap<>();
    while (rs.next()) {
        results.put(rs.getString("string1"), rs.getString("string2"));
    }
    return results;
});
Run Code Online (Sandbox Code Playgroud)


Mil*_*yal 9

你可以做这样的事情。

 List<Map<String, Object>> mapList = jdbctemplate.queryForList(query));
    return mapList.stream().collect(Collectors.toMap(k -> (Long) k.get("userid"), k -> (String) k.get("username")));
Run Code Online (Sandbox Code Playgroud)

输出:

 {
  1: "abc",
  2: "def",
  3: "ghi"
}
Run Code Online (Sandbox Code Playgroud)