技術メモのかけら

内容はもとより調べたことすら忘れてしまうので個人的なメモです。とにかく短く、結論だけ書いていきます。

MyBatisでnull項目の取得ではまった

今日Mybatisではまったこと。 以下のような値がnullの項目を含むレコードをselect。resultTypeにはMapを指定。

iduser_namemail_address
4 山田 太郎 (null)

取得結果をダンプしてみると、mail_address列はMapのキーが作られていない!

[{id=4, user_name=山田 太郎}]

もちろんmail_address列をselectしている。

    SELECT id,
           user_name,
           password,
           mail_address
      FROM emply
     WHERE id = #{id}

公式HPを調べてみるとMyBatisには'callSettersOnNulls'というオプションがあって、defaultはfalseになっていてnull項目はMapにputしないとのこと。

取得した値が null の場合にセッターあるいは Map の put メソッドを呼び出すかどうかを指定します。 この設定は Map.keySet() や null 値による初期化を利用している場合に有用です。プリミティブ型(int, boolean, 等)に null がセットされることはありません。

試しに設定ファイルに以下を追加したらnullの項目も取得できるようになった。

<settings>
    <setting name="callSettersOnNulls" value="true"/>
</settings>

nullの項目はnullが取得できるの普通だと思うのでデフォルトが逆なんじゃないかと思うのだが、 今開発中のシステムの設定値をいまさら変えられんし、うーんどうしよう。