web-dev-qa-db-ja.com

JDBCTemplate.queryForMapを使用してマップデータを取得する方法

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は私を助けます

30
user1127214

単一行を取得する場合は、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は大きく変わりました。)

46
hvgotcodes

これは本当に古いことは知っていますが、これは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

39
Brian Beech

@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;
});
18
cs_pupil