みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

これは配列処理?

JAVA配列処理で悩んでいます。
2つのテーブルにA,Bにおいて、テーブルAにたいして属性T3をキーワード(JAVA)で検索し、テーブル内の属性T1,T2,T3のデータを取ります。
Select T1,T2,T3 from A where T3 like ‘%JAVA%’

問題は、2つのテーブルにA,Bに共通するT1データをもとにA,BのデータT1,T2を表示したいのです。サブクエリは使わないで行う場合、
Select T2,T3 from B where T1 = “数字”; 
でテーブルBのT2,T3の結果が得られると思いますが、条件に見合う結果が複数個存在する場合、JAVAでどのように処理したらいいか分かりません。JAVAからのSQL操作は知っています。正直全く分かりません。Vectorクラスを用いるのでしょうか?
A,BそれぞれのT1,T2,T3をVectorへ追加していき表示の際に出力するのでしょうか?
丸二日考えても分からない課題です。どうかアドバイスお願いします。
分かりづらい質問ですいません。

投稿日時 - 2005-06-20 11:36:18

QNo.1460935

すぐに回答ほしいです

質問者が選んだベストアンサー

>Mapでは取得の際のキー名の記述ミスやnullを考慮いなければならなくなり
>バグの原因やコーディングの見通しの悪いものになります。
>たとえばAテーブルentityには、getAT1(),getB1()ゲッターメソッドとsetAT1()、
>getBT1どのセッターメソッドを定義しておき、それをListなどに
>格納すればすべてのデータの格納は可能でしょう。

別にどっちの方がいいというようなものでもないと思いますが。(^^;A
項目数が多くなればその分だけセッター、ゲッター作るの面倒ですし、
(自動生成するものがあるらしいのですが、自動生成してるにも関わらず
「セッターが見つからないのはなぜ?」
な質問も挙がってますし。(笑))
メソッド名を間違えたりすれば当然「バグの原因」にもなります。

そんな項目名のタイプミスのようなバグはUTで潰すのが普通であって、
それでもバグが出る。
っていうのはテスターの性格やプロジェクトの問題ですね。

あとこれは個人的な思いですが、
public void setXXX(String xxx){
XXX = xxx;
}
public String getXXX(){
return XXX;
}
なんてただセットしてただ返すだけのメソッドがたくさんある方が自分には微妙ですね…。
(だから汎用的に使えるHashMapやHashtableなんてのがあるのかと思ったり…
汎用的なだけに#3さんが仰るようにnullなどの対応をしなければなりませんが。
まぁ、そこら辺も「決め」次第でなんとでもなると思います。)

あと、O/Rマッピングで、DBに対してSQLを投げるのではなく、
エンティティに対して取得のメソッド呼んだりするのならわかりますが、
データの格納にテーブル毎にクラスを作るのもちょっと…

DBとやりとりして実際にSELECTやINSERTなどSQLを発行する部分なら
・どのデータがどのテーブルにあって…
などのことを意識しないといけませんが、
そのデータを単に使って見せるだけ、
データ格納クラスにセットしてUPDATEしてもらうだけ、
のような利用者からは
・どのデータがどのテーブルにあって…
のような情報は隠蔽されてる方が使いやすいと思います。
(まぁこれもそのシステムの規模や設計方針によって変わってしまいますが。)

長くなりましたが、その都度、便利な方、使いやすい方を選べば問題ないと思います。

投稿日時 - 2005-06-20 15:45:08

お礼

pcbeginner様 たびたびありがとうございます。
No.4で教えていただいた方法で解決しました。

Vector v = new Vector();

1件目:
HashMap map = new HashMap();
map.put("T1",t1value);
map.put("T2",t2value);
map.put("T3",t3value);
v.add(map);

また、一つの方法として、
//表示に向けての実行
String sql = "SQL文";
ResultSet result = stmt.executeQuery(sql);
//結果を標準出力へ表示
String array[] = new String[3];
while(result.next()){
array[0] = result.getString("T1");
・・・・
・・・以下省略
}
という方法があるようです。今この方法に取り組んでいます。うまくいきませんが。。
では失礼いたします。

投稿日時 - 2005-06-20 19:11:01

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

norinorimiさんの質問スレなのであまり関係のないものなので簡単にお返事させていただきます。
norinorimiさん申し訳ありません。


>項目数が多くなればその分だけセッター、ゲッター作るの面倒ですし、
(自動生成するものがあるらしいのですが、自動生成してるにも関わらず
「セッターが見つからないのはなぜ?」
な質問も挙がってますし。(笑))
メソッド名を間違えたりすれば当然「バグの原因」にもなります。

手間の問題ですが、確かにどれだけデータにアクセスするかそれはひとつの問題だと思います。1SQLであれば当然のことながら私の意見は無用の長物でしょう。
ただ、「セッターが見つからない」や「メソッド名間違い」などはバグ以前の問題では?w
カラム名にしても普通ならばハードコーディングではなくstaticな変数を使うでしょう。それらを書くのもかなりの手間ですよ。
あと、Mapなどの利点はおっしゃるとおりですが、不利な点としてキャストがあります。これはnull対応にも関連してきますが、カラムのデータ型をObjectではなくStringなどの匿名でないオブジェクトにすることでかなり有利になります。

#4さんの言われるように最終的にはプロジェクトの質になりますが複数の人が使う場合には、型を決めることでかなりミスが軽減できます。

投稿日時 - 2005-06-21 11:02:50

お礼

covachan様 わざわざコメントありがとうございます。
私はまだ本格的な開発を経験していないのでご指摘の点について知識がありません。今後質問するかもしれませんがどうぞよろしくお願いいたします。

この場をお借りしていつも助けていただいている皆様にお礼申し上げます。ありがとうございました。

投稿日時 - 2005-06-22 08:59:06

ANo.3

いまいち確信は持てないのですが、
A,Bの二つのテーブルよりT1が同じ値の複数データを問い合わせしてビーンに格納する。ということでよろしいのでしょうか?

問い合わせですが、2つのテーブルを結合するには「join」を使用します。一般的な結合として「left join」を使用した場合、

select A.T1,A.T2,A.T3,B.T1,B.T2,B.T3 from A left join B on A.T1=B.T1 where T1='数字'

というようになります。

あとは、これをレコードの数だけ格納すればいいのですが、今っぽいコーディングを意識してこれらをビーン(一般的にentityといわれる)に格納してはどうですか?
Mapでは取得の際のキー名の記述ミスやnullを考慮いなければならなくなりバグの原因やコーディングの見通しの悪いものになります。
たとえばAテーブルentityには、getAT1(),getB1()ゲッターメソッドとsetAT1()、getBT1どのセッターメソッドを定義しておき、それをListなどに格納すればすべてのデータの格納は可能でしょう。

投稿日時 - 2005-06-20 15:09:05

お礼

covachan様 ご回答ありがとうございます。
SQL文についてleft joinメソッドは使用したことないのですが勉強してみます。ありがとうございました。

投稿日時 - 2005-06-20 17:26:21

ANo.2

>格納した特定のmapのなかからT1だけを取り出す方法を現在調べています。

内部にVectorとHashMapを持つクラスを作って、
特定のデータを取得するメソッドを作ってあげるのはどうでしょう?

public class データ格納{
  private Vector v;
  private HashMap m;

  public データ格納(){
    //コンストラクタ
    v = new Vecotr();
    m = new HashMap();

  }
  public データ格納(Resultset rs){
    //mapにrsの内容をセットするコンストラクタ
    v = new Vecotr();
    データセット(rs);
  }

  public void データセット(Resultset rs){
    //mapにrsの内容をセット
    for(int i = 0;rsの件数分;i++{
      m = new HashMap();
      m.put(…);
      m.put(…);
      m.put(…);
      v.add(m);
    }
  }

  public void データセット(int 行数,String 項目名,Object 値){
    HashMap map = (HashMap)v.get(行数);
    map.put(項目名,値);
  }

  public String データ取得(int 行数,String 項目名){
    HashMap map = (HashMap)v.get(行数);
    String rtn = (String)map.get(項目名);
  }
}

こんな感じで。
いや、あまり深く考えずに書いたものなので、そのままじゃ動きませんし、例えば中身がない場合などの異例系も考慮していません。
参考程度に見て下さい。

投稿日時 - 2005-06-20 13:54:52

お礼

pcbeginner様 わざわざありがとうございます。
参考にさせていただきます。

今後もよろしくお願いいたします。

投稿日時 - 2005-06-20 14:52:34

ANo.1

SQLについてのことは他の方に任せます。


>条件に見合う結果が複数個存在する場合、JAVAでどのように処理したらいいか分かりません。
について。
HashMapもしくはHashtableの配列(もしくはVectorにつっこむ)はいかがでしょう?
各行を1つのHashMapに突っ込んで、そのHashMapをVectorに突っ込む。

例えば
Vector v = new Vector();

1件目:
HashMap map = new HashMap();
map.put("T1",t1value);
map.put("T2",t2value);
map.put("T3",t3value);
v.add(map);

2件目
…省略…
v.add(map2);

ってな感じで。


どのように処理するかっていうより、
「どのように使用するか」

「使いやすいように実装」
じゃないですかね???

投稿日時 - 2005-06-20 12:56:08

お礼

pcbeginner様 いつもありがとうございます。
言葉使いについてのご指摘ありがとうございます。
「JAVAでどのように実装するか」が正しい言葉使いですね。

Vectorだけを用いるよりHashMapメソッドも用いればよいのですね。格納した特定のmapのなかからT1だけを取り出す方法を現在調べています。これが分かれば何とかなりそうです。

投稿日時 - 2005-06-20 13:15:19

あなたにオススメの質問