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

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

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

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

Q&A

4回答

1888閲覧

Listで空の要素のみ更新したい

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2015/12/08 08:12

javaでSQLの結果をListに詰めるのですが
複数SQLをUNIONにて繋ぎ、取得できず空またはnullとなっている箇所に対して
補わせるSQLを流すという処理を行いたいと思っています。

作ってみたソースが以下のようになります。

for (aaaEntity m : resultList1) {
// List更新用のListを作成。
String bId = null;
bId = m.getBId();
if (bId == null) {
List<aaaEntity> resultList3 = this.selectBId(resultList1);
if (resultList3 != null && resultList3.size() > 0) {
for (int i = 0; i < resultList3.size(); i++) {
for (aaaEntity x : resultList3) {
resultList1.set(i, x);
}
}
}
}
}

これだと、全上書きになってしまいました。
nullまたは空となっている要素のみ更新したいときはどのように描くべきなのでしょうか?

※resultList1でUNIONを使用し全リストを取得してきています。
※resultList3がresultList1で取得できなかったbIdの要素を取得するためのSQLの結果を格納しているListになります。

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

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

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

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

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

guest

回答4

0

resultList1 のレコードと resultList3 のレコードを紐付けるキーは存在しているのでしょうか?
紐づくキー情報が無ければ組み合わせることは不可能ですので実現できません。

キーが有ることを前提にするならば以下の様なコードは参考になるでしょう。

{ // 補完情報を列挙 ただし 補完情報が無ければ、その時点で意味がなくなるので処理を抜ける List<aaaEntity> detailList = this.selectBId(resultList1); if (null == detailList || detailList.size() < 0) return; for (aaaEntity m : resultList1) { // 詳細を持つ場合は次のレコードへスキップする。インデントを深くしない目的の continue if (null != m.getBId()) continue; for (aaaEntity detail : detailList) { // [TODO] m と detail のキーの合致判定をここで行う boolean judge = false; if (judge) { // [TODO] m に detail の持つ詳細情報の転記を行う } } } }

老婆心ながら、UNION を使うという選択肢が出る時点でクエリやらテーブル設計に問題が有ると疑ったほうが良いです。業務上や立場上、手が出したくても出せないのであれば察しますが、まともな構造であれば JOIN を使って全て SQL 側で片付けるべき/片付けられる処理でしょう。UNION は重複排除のソートを行う分、レコード数に比例してパフォーマンスが大変残念な事になりやすいため、規模によっては大した問題では無いかもしれませんが、極力使用は避けるべきと考えます。

投稿2015/12/08 09:05

ps13zier

総合スコア433

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

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

0

とりあえず上書きされる原因だけは明確ですね。
コード内コメントで対象の箇所を※で示しておきます。

Java

1for (aaaEntity m : resultList1) { // ←resultList1の要素数分繰り返す 2 // List更新用のListを作成。 3 String bId = null; 4 bId = m.getBId(); 5 if (bId == null) { // ←BIDがnullの場合 6 List<aaaEntity> resultList3 = this.selectBId(resultList1); // ←ここって何してるんですか? 7 if (resultList3 != null && resultList3.size() > 0) { 8 for (int i = 0; i < resultList3.size(); i++) { 9 for (aaaEntity x : resultList3) { // ←どうしてここでresultList3の要素数分の繰り返し処理をするの? 10 resultList1.set(i, x); // ←※ここでresultList1のi番目をresultList3の最後の要素に置き換えてる 11 } 12 } 13 } 14 } 15 }

やりたい処理に対する期待値を言葉ではなく表なので記載してもらえたら答えやすいと思います。

投稿2015/12/08 09:01

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2015/12/08 09:15

6行目のresultList3を取得している部分は別メソッドにて、resultList1で取得できなかった項目を取得するSQLを実行しています。
退会済みユーザー

退会済みユーザー

2015/12/08 09:25

6行目で取得したいものってBIDなんですよね? だとしたらそもそもメソッドのIFがおかしい気がします。 aaaEntityにAID(キー項目),BID,CIDみたいなフィールドがある想定で回答させていただきます。 aaaEntity.BIDがNULLの場合に別SQLでBIDを取得するために必要な情報はキー項目であるAIDだけのはずです。 それなのにselectBIdメソッドにはList<aaaEntity>を渡しています。 これではresultList1の何番目のaaaEntityに設定したいのかが判断できません。 それとselectBIdメソッドの戻り値がList<aaaEntity>となっているのも気になります。 "selectBId"メソッドはBID(String値)をSELECTしてくるメソッドという意味で名前をつけたんですよね? とりあえずコードを書くよりも、一度フローチャートをしっかりと考えてからコーディングした方が理解が深まると思います。 (ER次第だけど、SQL一回で事が済みそうな気がしてならない・・・)
guest

0

resultList1に
{"A", "B", null, "D"}がある時

  1. resultList3はどういう内容ですか
  2. 最終的に得たいresultList1はどういう内容ですか

投稿2015/12/08 08:59

liguofeng29

総合スコア801

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

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

退会済みユーザー

退会済みユーザー

2015/12/08 09:07

resultListが上記の場合 主キーとなる AはresultList3にも存在し、その他はresultList1でnullとなった個所を含みます。 例として resultList1 = {A,B,null,D} resultList3 = {A,null,C,D}などです。 最終的には resultList1に値の更新・追加を行い resultList1 = {A,B,C,D}となるようにしたいです。
liguofeng29

2015/12/08 09:20

List<aaaEntity> resultList3 = this.selectBId(resultList1); と書いてますが、主キーとなるってことは aaaEntity entity = this.selectBId(resultList1); になりませんか?
guest

0

とりあえず、改行しました。
すべて上書きだったということは、すべてnullだったってことですか?

for (aaaEntity m : resultList1) { // List更新用のListを作成。 String bId = null; bId = m.getBId(); if (bId == null) { List<aaaEntity> resultList3 = this.selectBId(resultList1); if (resultList3 != null && resultList3.size() > 0) { for (int i = 0; i < resultList3.size(); i++) { for (aaaEntity x : resultList3) { resultList1.set(i, x); } } } } }

投稿2015/12/08 08:34

Cafelike

総合スコア89

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

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

退会済みユーザー

退会済みユーザー

2015/12/08 08:38

nullではなく、本来はresultList1にresultList3をnull項目のみ更新の形で追加したいと思っています。 現在はresultList3の結果で更新されてしまっています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問