JDBCTemplate.queryForMap()
からデータをロードし、Map Interfaceを返す方法。マップ内でクエリデータを内部的に維持する方法。ロードしようとしましたが、例外、つまり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は私を助けます
単一行を取得する場合は、queryForMap
が適切です。 where
句なしで選択しているので、おそらくqueryForList
が必要です。このエラーは、おそらくqueryForMap
が1つの行を必要としていることを示していますが、クエリは多くの行を取得しています。
ドキュメントをご覧ください。 sqlのみを使用するqueryForList
があります。戻り値の型は
_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)
(Javalandを離れてから、Springは大きく変わりました。)
これは本当に古いことは知っていますが、これは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;
}
});
これにより、Mapsのリストではなく、複数の行(ただしクエリが多く返されました)を持つMapの戻り値の型が提供されます。 ResultSetExtractorのドキュメントはこちらで表示できます: http://docs.spring.io/spring-framework/docs/2.5.6/api/org/springframework/jdbc/core/ResultSetExtractor.html
@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;
});