質問: Mybatisのforeachで複数列指定のIN句をどのようにかけばよいか苦戦しています。 DBはDB2です。 具体的には下記のようなSQLを動的に生成したいです。 ### 実現したいSQL ``` SELECT ユーザー名 FROM ユーザー情報テーブル WHERE (ユーザーID親, ユーザーID枝) IN (VALUES ('001','01'),('002','01')) ``` Javaからは下記のようなVOのリスト(List)を渡します。 ### SQLに渡すVO ``` public class User { private String userIdOya; private String userIdEda; } ``` 上記を踏まえて以下のように書いてみたのですが、どうも違うような気がします。。。 ちなみにまだ動作確認できる環境がありません。 ### Mapper.xml ``` SELECT ユーザー名 FROM ユーザー情報テーブル WHERE (ユーザーID親, ユーザーID枝) IN (VALUES #{item.userIdOya}, #{item.userIdEda} ``` どなたかご教授お願いいたします。
回答: 答えを書いてしまうのはアレなので、現状どのように動作するかを解説するので、それを踏まえてもう一度検討していただきたいです。 (listに要素が2つ入っている状態を想定します。) * foreachはループ開始前に、openで指定された文字列を出力します。今回は"("です。 ``` WHERE (ユーザーID親, ユーザーID枝) IN (VALUES ( ``` * 1つ目の要素を取り出し、foreachタグ内に記載された内容を出力します。 ``` WHERE (ユーザーID親, ユーザーID枝) IN (VALUES ( ユーザID親1, ユーザID枝1 ``` * 次のループに進む場合は、separatorで指定された文字列を出力します。今回は","です。 ``` WHERE (ユーザーID親, ユーザーID枝) IN (VALUES ( ユーザID親1, ユーザID枝1, ``` * 2つ目の要素を取り出し、foreachタグ内に記載された内容を出力します。 ``` WHERE (ユーザーID親, ユーザーID枝) IN (VALUES ( ユーザID親1, ユーザID枝1, ユーザID親2, ユーザID枝2 ``` * ループが終了するので、closeで指定された文字列を出力します。今回は")"です。 ``` WHERE (ユーザーID親, ユーザーID枝) IN (VALUES ( ユーザID親1, ユーザID枝1, ユーザID親2, ユーザID枝2) ``` 以上のようなことを踏まえてもう一度Mapper.xmlを検討してみてください。 なお、動作確認環境がないとのことですが、早急に環境を準備することをお勧めします。