質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

Q&A

解決済

4回答

2996閲覧

ArrayListのデータ挿入について

freeair.

総合スコア15

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

ArrayList

Java用のタグです。arrayListはListインターフェースを実装した、リサイズ可能な配列用クラスです。

0グッド

0クリップ

投稿2016/11/09 03:01

編集2016/11/09 05:49

Java

1 2List<aaaEntity> list = new ArrayList<aaaEntity>(); 3while (result.next()) { 4 aaaEntity entity = new aaaEntity(); 5 6 entity.setHoge(result.getString("hoge")); 7 entity.setVar(result.geString("var")); 8 entity.setDate(result.getString("date")); 9 entity.setCost(result.getString("cost")); 10 list.add(entity); 11 } 12 13

データ(hoge,var,date,cost)の入ったリストを作る上記のようなものがあるのですが、
実際のソースコードの仕組み上whileを二つに分けて作ったので、最終的に纏めあげるようなことをして、上記と同じリストにしたいのですが
下記のように、list.addを使用するとdateとcostだけの独立した要素が挿入されてしまうのでどうすればよいか分かりません。
ご教示のほどお願いします。よろしくお願いします。

java

1 2String sql = createSql(); 3PreparedStatement stmt = null; 4ResultSet result = null; 5 6String sql2 = createSql2(); 7PreparedStatement stmt2 = null; 8ResultSet result2 = null; 9try{ 10 stmt = getConn().prepareStatement(sql); 11 stmt.setString(1, aiu); 12 result = stmt.executeQuery(); 13 14 15 stmt2 = getConn().prepareStatement(sql2); 16 stmt2.setString(1, aiu); 17 result2 = stmt.executeQuery(); 18 19 20 while (result.next()) { 21 aaaEntity entity = new aaaEntity(); 22 23 entity.setHoge(result.getString("hoge")); 24 entity.setVar(result.geString("var")); 25 list.add(entity); 26 } 27 int row = 0; 28 while (result2.next()) { 29 aaaEntity entity = new aaaEntity(); 30 31 entity.setDate(result2.getString("date")); 32 entity.setCost(result2.getString("cost")); 33 list.add(row, entity); 34 row++; 35 } 36} 37 38private String createSql() { 39 StringBuilder sb = new StringBuilder(); 40 41 sb.append(" SELECT"); 42 sb.append(" hoge"); 43 sb.append(" ,var"); 44 sb.append(" ,date"); 45 sb.append(" FROM"); 46 sb.append(" testtable"); 47 sb.append(" WHERE date = ?"); 48 return sb.toString(); 49} 50private String createSql2() { 51 StringBuilder sb = new StringBuilder(); 52 53 sb.append(" SELECT"); 54 sb.append(" date"); 55 sb.append(" ,cost"); 56 sb.append(" FROM"); 57 sb.append(" testtable2"); 58 sb.append(" WHERE date = ?"); 59 return sb.toString(); 60}

補足--
createSqlとcreateSql2を結合したら多分こんな感じです。

Java

1private String createSql() { 2 StringBuilder sb = new StringBuilder(); 3 4 sb.append(" SELECT"); 5 sb.append(" ttbl1.hoge"); 6 sb.append(" ,ttbl1.var"); 7 sb.append(" ,ttbl2.date"); 8 sb.append(" ,ttbl2.cost"); 9 sb.append(" FROM"); 10 11 sb.append(" (SELECT"); 12 sb.append(" hoge"); 13 sb.append(" ,var"); 14 sb.append(" ,date"); 15 sb.append(" FROM"); 16 sb.append(" testtable"); 17 sb.append(" WHERE date = ?"); 18 sb.append(" ) ttbl1"); 19 20 sb.append(" INNER JOIN"); 21 sb.append(" (SELECT"); 22 sb.append(" date"); 23 sb.append(" ,cost"); 24 sb.append(" FROM"); 25 sb.append(" testtable2"); 26 sb.append(" WHERE date = ?"); 27 sb.append(" ) ttbl2"); 28 29 sb.append(" (ttbl1.date = ttbl2.date) "); 30 31 return sb.toString(); 32}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KiyoshiMotoki

2016/11/09 03:16

変数 result は java.sql.ResultSet インターフェースでしょうか? であれば、2回に分けて実行しているSQL文を結合し、1回のクエリ実行でデータを取得できるようにするのがもっとも無難な修正方法だと考えます。「その方法が分からない」ということであれば、実行しているSQL文を質問欄に追記してください。
freeair.

2016/11/09 04:29

編集しました。sql文二つをINNNER JOINで結合した新しいsql文を追加することはできますけど、必ずしも両方のテーブルにデータがあるわけではないのでそのときwhile内の処理は動きません・・・。処理で二つのsql文を結合する方法はわからないです。
KiyoshiMotoki

2016/11/09 05:34

情報の追記、ありがとうございます。「sql文二つをINNNER JOINで結合した新しいsql文を追加することはでき」る、とのことですが、その際の結合条件はどのようになりますか?また、「必ずしも両方のテーブルにデータがあるわけではない」とは具体的にはどのような状況ですか?「testtable にあって testtable2 にないデータがあり得る」のか、「testtable2 にあって testtable にないデータがあり得る」のか、それとも「その両方のケースがあり得る」のか。
freeair.

2016/11/09 05:52

有難うございます、補足しました。見づらくてすみません。「testtable2 にあってtesttable にないデータが有り得る」←これだと思います。
guest

回答4

0

ベストアンサー

回答欄やコメント欄に追記いただいた情報を総合すると、以下のSQL文で、1度に望むデータを取得できるはずです。

sql

1SELECT 2 ttbl1.hoge, 3 ttbl1.var, 4 ttbl2.date, 5 ttbl2.cost 6FROM testtable2 AS ttbl2 7LEFT OUTER JOIN testtable AS ttbl1 8 ON ttbl2.date = ttbl1.date 9WHERE ttbl2.date = ?

ただし、このSQL文は WHERE句と ON句の両方でdateカラムだけを使用しているため、両テーブルに条件に該当するdateを持つレコードが複数ある場合、それらの直積を返してしまいます。
(この問題は、質問欄に追記いただいた INNER JOIN 付きの SQL文も同様です)

ご自分でも気づいていない結合条件などが他にないか、よく確かめてみてください。

投稿2016/11/09 06:21

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

freeair.

2016/11/09 06:51

なるほど、testtable2のほうを優先させる?みたいなことですよね。 調査不足でした。。しかしながら的確な回答ありがとうございます。 直積・・・?片方のテーブルはdateの値が重複して存在しないので問題ないかと思います。 改めてありがとうございます。
guest

0

「testtable2 にあってtesttable にないデータが有り得る」という状況のようなので、testtable2を基準に「外部結合」を使って1つのSQLにするのが最適の方法かと思います。
参考:逆引きSQL構文集 - テーブルを外部結合する

その方法に関しては他に回答があるので、あえて別SQLで行うことに拘った方法を提示しておきます。

Java

1//まずresultの結果でlistを作る 2while (result.next()) { 3 aaaEntity entity = new aaaEntity(); 4 5 entity.setDate(result.getString("date")); 6 entity.setHoge(result.getString("hoge")); 7 entity.setVar(result.geString("var")); 8 list.add(entity); 9} 10 11while (result2.next()) { 12 aaaEntity entity1 = null; 13 aaaEntity entity2 = new aaaEntity(); 14 15 entity2.setDate(result2.getString("date")); 16 entity2.setCost(result2.getString("cost")); 17 18 for(int i=0; i<list.size(); i++){ 19 //要素を1つ取得 20 entity1 = list.get(i); 21 22 //entity1の日付がentity2の日付と同じかチェック 23 if(entity2.getDate().equals(entity1.getDate())){ 24 //一致したら、entity1にentity2の持つデータをセット 25 entity1.setCost(entity2.getCost()) ; 26 27 break; 28 } 29 } 30}

投稿2016/11/09 06:38

KaedeKazane

総合スコア408

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

freeair.

2016/11/09 06:55

なるほど、敢えて同じ内容のデータを登録させることで関連性ができるんですね。 考え方として今後の参考にします。ありがとうございます。
guest

0

最終的に纏めあげるようなことをして

ここが本件のポイントだと思います。testtableとtesttable2にある特定の行にどのような関係があるものをまとめるのかがわからないとどう纏めるのが適切なのかがお答えできません。「適当に纏める」というのでは問題が意味をなさないことになります。aiuの内容が書かれていればそれも推測できるのですが質問のプログラムにそれが含まれていないので推測ができないのです。

なお、適切に纏める方法がわかれば(aiuの条件がわかれば)おそらく1つのSQLで記述できるはず(というより1つのSQLで記述できなければならないはず)と思います。

もし2つの別々なSQL問い合わせ結果を先頭から順番に一つのaaaEntityに纏めると仮定するならそれなりにコードを書くことはできますが、その結果にあまり意味があるように思えないのですが・・・

SQL1の結果 hoge1 var1 hoge2 var2 SQL2の結果 data1 cost1 data2 cost2 =>javaのコードで以下のような結果にする? 結果 hoge1 var1 data1 cost1 hoge2 var2 data2 cost2

追記:
あれ・・・where句にdata=の条件がありましたね。失礼しました。
KiyoshiMotokiさんが既に回答されてますのでそちらをご覧ください。

投稿2016/11/09 05:50

編集2016/11/09 06:35
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

freeair.

2016/11/09 06:02

要は、頭に書いたコードで得られるlistと同じものを、作りたいということです。
freeair.

2016/11/09 06:06

コードに書かれてる内容で概ね合ってるような気はします。 SQLを一つにしてしまうと、どちらかのテーブルにデータがなかった場合どちらも取得できなくなるのでそれはしたくないです。
guest

0

意図がわかっておらず間違っているかもしれませんが、

aaaEntity entity = new aaaEntity();

これをwhileの外に配置すればどうでしょうか。

投稿2016/11/09 03:07

aki178

総合スコア164

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

freeair.

2016/11/09 04:25

それ外に出したら初期化されないのでうまくリスト作れないと思うんです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問