- - PR -
セレクト文の最適化について
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2006-06-05 10:41
ssssをキーにしてデータを1度に取得する処理を作りました。
※ddd = 1という条件が加わりました。 String sPrepareSQL = "SELECT ssss, aaa, bbb, ccc FROM S002 WHERE ddd = 1"; psSelS002_ = con_.prepareStatement(sPrepareSQL); rs = psSelS002_.executeQuery(); ssssをキーにしてaaa, bbb, cccを一気にデータをとってきたいです。 DBの構成として、 ssssが11なら、aaaは0900、 bbbは0800, cccは0700, ssssが12なら、aaaは1900、 bbbは1100, cccは0700, ssssが13なら、aaaは0100、 bbbは0600, cccは0700, ・ ・ ・ ssssが18なら、aaaは1100、 bbbは0600, cccは1200 となっています。 下記のようにプログラムを組んでみました。 Map tmpMap = null; Map map = new HashMap(); HashMap timeMap = new HashMap(); while(rs.next()){ tmpMap = (Map)rs; timeMap.put(tmpMap.get("aaa"), rs.getString("aaa")); timeMap.put(tmpMap.get("bbb"), rs.getString("bbb")); timeMap.put(tmpMap.get("ccc"), rs.getString("ccc")); map.put(timeMap.get("ssss"),timeMap.clone()); timeMap.clear(); } rs.close();rs = null; 下記処理でエラーがでます。 int dpaaa = Integer.valueOf(map.get("ssss").get("aaa")).intValue(); なので下記のように修正しましたが、エラーが出ました。 timeMap = map.get("ssss"); int dpaaa =Integer.valueOf(timeMap.get("aaa")).intValue(); どうすれば処理はうまくいくのでしょうか。 |
|
投稿日時: 2006-06-05 16:51
う〜ん・・・
かなり混乱しているような気がします。 もう一度、自分のやりたいことを整理してみてはどうでしょう。 1.DBにはどういうデータが入っているのか。 2.一回のSQL文で必要な情報を取得するにはどういうSQL文が必要なのか。 3.2のSQL文を発行して取得されるResultSetはどういう形式でデータが格納されているのか。 4.最終的にはどのような形式のデータが必要なのか。 5.3から4の形式に変換するにはどうしたらよいのか。 ちなみに、ResultSetをMapにキャストするようなことは、通常行いません。 ドライバによってはClassCastExceptionが発生しますし、Mapとして使用する必要もないと思いますが・・・ それから、aaa, bbb, cccを無理矢理Mapに突っ込むのではなく、(ssssを含む?)データクラスを作成してそこに入れた方が分かりやすいコードになるでしょうね。 |
|
投稿日時: 2006-06-05 17:38
一応ここまで出来ました。
HashMap timeMap = new HashMap(); Map map = new HashMap(); while(rs.next()){ timeMap.put("aaa",rs.getString("aaa")); timeMap.put("bbb",rs.getString("bbb")); timeMap.put("ccc",rs.getString("ccc")); timeMap.put("ssss",rs.getString("ssss")); map.put("ssss",timeMap.clone()); System.out.println(map); timeMap.clear(); } rs.close();rs = null; mapの中身出力: {ssss={aaa=1100, bbb=1230, ccc=1500, ssss=11}} {ssss={aaa=1100, bbb=1230, ccc=1500, ssss=12}} {ssss={aaa=1100, bbb=1230, ccc=1500, ssss=13}} {ssss={aaa=1100, bbb=1230, ccc=1510, ssss=21}} {ssss={aaa=1100, bbb=1230, ccc=1510, ssss=22}} {ssss={aaa=1100, bbb=1230, ccc=1515, ssss=31}} {ssss={aaa=1100, bbb=1230, ccc=1515, ssss=32}} 下記のように、ファイルから取得した値(ssss_) ssss_ = line.substring(14,16);とmapのssssがイコールの時 mapのaaa, bbb, cccを取得し、int型に変換したいです。 int dpaaa = Integer.valueOf(rs.getString("aaa")).intValue(); int dpbbb = Integer.valueOf(rs.getString("bbb")).intValue(); int dpccc = Integer.valueOf(rs.getString("ccc")).intValue(); あたり前ですが、このままだとNullポインターのエラーが出ます。 どのようにaaa, bbb, cccを取得すればよいのでしょうか。 |
|
投稿日時: 2006-06-05 18:46
mapに入れているのだから、mapから取り出さないと。
map.get("xxxxx"); ですよね。 あとは自分で考えてください。 |
|
投稿日時: 2006-06-05 18:58
まず、mapに要素を追加しているところですが、キーが"ssss"固定になっていますよね。
これだと、最後の行以外は上書きされて消えてしまいます。 恐らく"ssss"の値をキーにするのが適切でしょう。 そうすれば、ssss_をキーにmapから取得する値が目的の行(HashMap)となります。 それから、Stringをint型に変換したい場合は、「Integer.valueOf(String).intValue()」ではなく、「Integer.parseInt(String)」とした方が簡単ですよ。 |
|
投稿日時: 2006-06-05 19:03
ありがとうございます。
Map ssMap = (Map)map.get("ssss"); int dpaaa = Integer.valueOf((String)ssMap.get("aaa")).intValue(); これで解決できました! |