動的SQLを試す

ユーザー情報的なテーブルがあって、ログインIDかユーザー名か(またはその両方)で
検索するような機能をMyBatisとPostgreSQLで試す。


で、まずはベタにこんな感じ。

  • 画面からくるパラメータの前後に%を付加してlike〜という変数に設定しておく。
  • <if>を使って、like〜という変数がnullでなければ、その条件を追加する。
    • test属性には、ognlライクな記述ができるみたい。
  • <where>で囲うと、1つ目の条件文(loginId)がない場合、2つ目以降のandを勝手に取ってくれる。
    • これ便利なんだけど、SQLを記述する際にandをまったく付けないで、自動的にandを付けてくれた方が楽だよなぁ。始めそういう風に書いてて動かなくてハマったというだけなんだけど。
<select id="searchUser" resultType="UserInfoVo">
    select * from userinfo
    <where>
        <if test="likeLoginId != null">
            loginid like #{likeLoginId}
        </if>
        <if test="likeUserName != null">
            and username like #{likeUserName}
        </if>
    </where>
</select>

で、これだとlike〜ってフィールドを増やさなきゃいけないし、%を付加する処理を入れるのもめんどい。
というわけで、こんな感じにしてみる(search〜というパラメータが画面からくる値まんま)。

<select id="searchUser" resultType="UserInfoVo">
    select * from userinfo
    <where>
        <if test="searchLoginId != null and searchLoginId != ''">
            loginid like '%' || #{searchLoginId} || '%'
        </if>
        <if test="searchUserName != null and searchUserName != ''">
            and username like '%' || #{searchUserName} || '%'
        </if>
    </where>
</select>


とりあえずこれでいいかぁ。
nullチェック、空文字チェックをシンプルにできないものか・・・。