44

からデータをロードする方法とJDBCTemplate.queryForMap()、マップインターフェイスを返します。クエリデータをマップ内で内部的に維持する方法。ロードしようとしましたが、例外、つまり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は私を助けます

4

4 に答える 4

59

queryForMap単一の行を取得する場合に適しています。句なしで選択しているwhereので、おそらくしたいでしょうqueryForList。このエラーは、queryForMap1 つの行が必要であるにもかかわらず、クエリで多数の行を取得していることを示している可能性があります。

ドキュメントをチェックしてください。queryForListsql のみを使用 する があります。戻り型は

List<Map<String,Object>>.

そのため、結果が得られたら、自分が行っていることを行うことができます。私は次のようなことをします

List results = template.queryForList(sql);

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

詳細を記入させていただきますが、この場合、キーを反復処理しません。私が期待していることを明示するのが好きです。

オブジェクトがUserあり、実際に User インスタンスをロードしたい場合は、queryForListSQL とクラス型を取る を使用できます。

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 に答える
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 に答える