【MyBatis】SQL文のIN句で配列を使う方法

MyBatisjava
スポンサーリンク
スポンサーリンク

MyBatisのIN句で配列を使う方法

最近Java触ってます、Springフレームワーク+Mybatisを使用して開発をしていたのですが、Mybatisにハマって闇落ち、魔女化しそうになったのでメモ。Mybatisってなんぞやーって人はいないと思いますが、一応軽く説明を

MyBatis はJavaならびに.NET Frameworkで利用可能な、XMLまたはアノテーションを用いてストアドプロシージャやSQL文をオブジェクトと紐付ける永続性フレームワークである。Apache License 2.0によるオープンソースソフトウェアとして提供されている。
以前はiBATISとして知られていた。

出典:MyBatis ウィキペディア(Wikipedia)

MyBatisはよく使うであろうORマッパーとは違い、SQLとオブジェクトをマッピングするので、SQLをゴリゴリ書きたい人には良いものです、まぁそこでハマって闇落ちしそうになっているんですけどね・・・

やりたかった事

SpringでMyBatisのIN句に配列を渡して以下のようなSQLを叩きたかった。
SELECT column_a FROM table_b WHERE column_c IN ('1','2','3')

ハマったエラー

not found・・・定番ですよね、型が違うんだよね、分かるよ(わからん)

Parameter 'arrayList' not found. Available parameters are [array]

解決策

パラメーターとしてこのように渡す事で解決しました。
arrayList(なんか配列)

Map<String, Object> params = new HashedMap<>();
params.put("arrayList", arrayList);
※この時arrayListを直接渡すとエラーになる(これにはまりました)
一度Mapを作成して渡したらうまくいきました。

MyBatisのSQLマップは以下のように書く

<select id="selectHoge" resultType="返却値の型">
    select
        column_a
    from
        table_b
    where
        column_c in
        <foreach item="item" collection="arrayList" open="(" separator="," close=")">
            #{item}
        </foreach>
</select>
 もっといい方法があったら教えてください。
 とりあえずメモ。

コメント