はじめに
検索結果を取得する機能で、「入力フォームから取得した検索条件」と「事前に準備した非表示のリスト」という2つの引数で絞り込みを行いたい場面に遭遇した。そこで、2つの引数をMybatisに渡し、絞り込みを行なった結果を取得しようとした際に躓いた点についてまとめてみた。
実現したいこと
Mybatisで二つ以上の引数を使用してSQLを実行する。
調査
Mybatisでは複数の引数をただ渡すだけでは識別してくれない。@Paramアノテーションを用いることで、各引数に名前づけを行いMybatis側でその引数名が使用できる様子。
実装
@Mapper
public interface SearchMapper {
public List<ACCOUNT> searchAccount(@Param("searchForm") SearchForm searchForm,
@Param("hideList") List<Integer> hideList);
}
<select id="searchAccount" resultType="com.example.matching.entity.ACCOUNT">
SELECT *
FROM ACCOUNT
WHERE ID NOT IN
<foreach item="item" index="index" collection="hideList"
open="(" separator="," close=")">
#{item}
</foreach>
<if test="searchForm.AGE_LOWER != null and searchForm.AGE_UPPER != null">
AND AGE BETWEEN CAST(#{searchForm.AGE_LOWER} as INTEGER) and CAST(#{searchForm.AGE_UPPER} as INTEGER)
</if>
ORDER BY CREATED DESC
</select>
まとめ
@Paramを付与しない場合、第一引数はparam1、第二引数はparam2のように「param+1からのインデックス」という変数になります。
以下、参考記事によると、@Paramを用いることなくMybatisで複数の引数を使用することは可能なようだが、基本的には@Paramの使用が推奨されている。
参考記事