如何从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;
}
Plz帮帮我
答案 0 :(得分:44)
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
对象,并且您确实想要加载用户实例,则可以使用带有sql和类类型的queryForList
queryForList(String sql, Class<T> elementType)
(自从我离开Javaland以来,Spring已经发生了很大变化。)
答案 1 :(得分:37)
我知道这很老,但这是查询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
答案 2 :(得分:15)
要添加到@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;
});
答案 3 :(得分:1)
您可以执行以下操作。
{
1: "abc",
2: "def",
3: "ghi"
}
输出:
{{1}}