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

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

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

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

DB2

DB2(IBM Database2)は、IBMのリレーショナルデータベース管理システム製品です。 UNIXとWindows、IBM社のメインフレームOS用が用意されており、 幅広いプラットフォームに対応しています。

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

Q&A

解決済

1回答

22579閲覧

MyBatisのForeachで複数列指定のIN句を実現したい。

kanitama111

総合スコア8

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

DB2

DB2(IBM Database2)は、IBMのリレーショナルデータベース管理システム製品です。 UNIXとWindows、IBM社のメインフレームOS用が用意されており、 幅広いプラットフォームに対応しています。

MyBatis

MyBatisはJavaや.NET Frameworkでなどで使用できる、SQL文や、ストアドプロシージャをオブジェクトと紐付けるO/Rマッピングフレームワークです。

1グッド

1クリップ

投稿2018/07/04 13:56

編集2018/07/04 13:58

Mybatisのforeachで複数列指定のIN句をどのようにかけばよいか苦戦しています。

DBはDB2です。

具体的には下記のようなSQLを動的に生成したいです。

実現したいSQL

SQL

1SELECT 2    ユーザー名 3FROM 4    ユーザー情報テーブル 5WHERE 6    (ユーザーID親, ユーザーID枝) IN (VALUES ('001','01'),('002','01'))

Javaからは下記のようなVOのリスト(List<User>)を渡します。

SQLに渡すVO

Java

1 2public class User { 3 4private String userIdOya; 5 6private String userIdEda; 7 8}

上記を踏まえて以下のように書いてみたのですが、どうも違うような気がします。。。
ちなみにまだ動作確認できる環境がありません。

Mapper.xml

Mapper.xml

1<select id="selectUserName" parameterType="User" resultType="java.lang.String"> 2 SELECT 3   ユーザー名 4 FROM 5     ユーザー情報テーブル 6 WHERE 7     (ユーザーID親, ユーザーID枝) IN (VALUES 8 <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> 9 #{item.userIdOya}, 10 #{item.userIdEda} 11 </foreach> 12</select>

どなたかご教授お願いいたします。

A-pZ👍を押しています

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

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

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

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

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

kanitama111

2018/07/04 21:22

2ab1f83ccd8cさん 上記リンクありがとうございます。確認いたしましたが複数列指定ではないため、私が実現したいものとは異なります。
guest

回答1

0

ベストアンサー

答えを書いてしまうのはアレなので、現状どのように動作するかを解説するので、それを踏まえてもう一度検討していただきたいです。
(listに要素が2つ入っている状態を想定します。)

  • foreachはループ開始前に、openで指定された文字列を出力します。今回は"("です。

sql

1WHERE (ユーザーID親, ユーザーID枝) IN (VALUES (
  • 1つ目の要素を取り出し、foreachタグ内に記載された内容を出力します。

sql

1WHERE (ユーザーID親, ユーザーID枝) IN (VALUES ( ユーザID親1, ユーザID枝1
  • 次のループに進む場合は、separatorで指定された文字列を出力します。今回は","です。

sql

1WHERE (ユーザーID親, ユーザーID枝) IN (VALUES ( ユーザID親1, ユーザID枝1,
  • 2つ目の要素を取り出し、foreachタグ内に記載された内容を出力します。

sql

1WHERE (ユーザーID親, ユーザーID枝) IN (VALUES ( ユーザID親1, ユーザID枝1, ユーザID親2, ユーザID枝2
  • ループが終了するので、closeで指定された文字列を出力します。今回は")"です。

sql

1WHERE (ユーザーID親, ユーザーID枝) IN (VALUES ( ユーザID親1, ユーザID枝1, ユーザID親2, ユーザID枝2)

以上のようなことを踏まえてもう一度Mapper.xmlを検討してみてください。
なお、動作確認環境がないとのことですが、早急に環境を準備することをお勧めします。

投稿2018/07/04 23:48

編集2018/07/05 00:18
d-yosh

総合スコア270

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

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

kanitama111

2018/07/06 22:19

解説ありがとうございます。ベストアンサーとさせていただきました。 まだ環境が整っていないため動作確認はできていませんが、下記のように実装致しました! <select id="selectUserName" parameterType="User" resultType="java.lang.String"> SELECT   ユーザー名 FROM      ユーザー情報テーブル WHERE      (ユーザーID親, ユーザーID枝) IN (VALUES <foreach item="item" index="index" collection="list" open="(" separator="),(" close="))"> #{item.userIdOya}, #{item.userIdEda} </foreach> </select> 以上、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問