- PR -

セレクト文の最適化について

投稿者投稿内容
まな
常連さん
会議室デビュー日: 2005/10/26
投稿数: 45
投稿日時: 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();
どうすれば処理はうまくいくのでしょうか。

luckseed
常連さん
会議室デビュー日: 2006/05/23
投稿数: 24
投稿日時: 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を含む?)データクラスを作成してそこに入れた方が分かりやすいコードになるでしょうね。
まな
常連さん
会議室デビュー日: 2005/10/26
投稿数: 45
投稿日時: 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を取得すればよいのでしょうか。
KOX
大ベテラン
会議室デビュー日: 2004/08/23
投稿数: 142
投稿日時: 2006-06-05 18:46
mapに入れているのだから、mapから取り出さないと。
map.get("xxxxx"); ですよね。
あとは自分で考えてください。
luckseed
常連さん
会議室デビュー日: 2006/05/23
投稿数: 24
投稿日時: 2006-06-05 18:58
まず、mapに要素を追加しているところですが、キーが"ssss"固定になっていますよね。
これだと、最後の行以外は上書きされて消えてしまいます。

恐らく"ssss"の値をキーにするのが適切でしょう。
そうすれば、ssss_をキーにmapから取得する値が目的の行(HashMap)となります。

それから、Stringをint型に変換したい場合は、「Integer.valueOf(String).intValue()」ではなく、「Integer.parseInt(String)」とした方が簡単ですよ。
まな
常連さん
会議室デビュー日: 2005/10/26
投稿数: 45
投稿日時: 2006-06-05 19:03
ありがとうございます。
Map ssMap = (Map)map.get("ssss");
int dpaaa = Integer.valueOf((String)ssMap.get("aaa")).intValue();
これで解決できました!

スキルアップ/キャリアアップ(JOB@IT)