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

vzgqcmou  于 2023-04-04  发布在  Spring
关注(0)|答案(4)|浏览(317)

如何在JDBCTemplate.queryForMap()返回Map接口时从JDBCTemplate.queryForMap()加载数据?查询数据如何在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;
}
jogvjijk

jogvjijk1#

queryForMap适用于只获取一行的情况。您的选择没有使用where子句,因此您可能希望使用queryForList。该错误可能表明queryForMap只需要一行,但您的查询正在检索许多行。
Check out the docs.有一个queryForList只接受sql;返回类型为
List<Map<String,Object>> .
所以一旦你有了结果,你就可以做你正在做的事情。我会做一些像

List results = template.queryForList(sql);

for (Map m : results){
   m.get('userid');
   m.get('username');
}

我会让你填写细节,但我不会在这种情况下迭代键。我喜欢明确我所期望的。
如果您有一个User对象,并且您实际上希望加载User示例,则可以使用接受sql和类类型的queryForList
queryForList(String sql, Class<T> elementType)
(wow自从我离开Javaland以来,Spring已经改变了很多。

du7egjpx

du7egjpx2#

我知道这很老了,但这是查询Map的最简单的方法。
只需实现ResultSetExtractor接口来定义要返回的类型。下面是如何使用它的示例。您将手动Map它,但对于简单的Map,它应该很简单。

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

py49o6xq

py49o6xq3#

为了补充@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;
});
fiei3ece

fiei3ece4#

你可以做这样的事。

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

相关问题