44

如何从中加载数据JDBCTemplate.queryForMap()并返回地图接口。如何在地图内部维护查询数据。我试图加载但我得到以下异常,即org.springframework.dao.IncorrectResultSizeDataAccessException: Incorrect result

代码:-

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;
}

请帮帮我

4

4 回答 4

59

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');
} 

我会让你填写详细信息,但在这种情况下我不会遍历键。我喜欢明确说明我的期望。

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

queryForList(String sql, Class<T> elementType)

(哇,自从我离开 Javaland 以来,Spring 发生了很大变化。)

于 2012-04-05T13:49:10.733 回答
52

我知道这真的很旧,但这是查询 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;
    }
});

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

于 2015-10-15T14:27:06.220 回答
29

要添加到@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;
});
于 2017-05-25T19:27:00.513 回答
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")));

输出:

 {
  1: "abc",
  2: "def",
  3: "ghi"
}
于 2019-11-05T10:29:53.967 回答