MyBatisのMapKeyはValueがクラスじゃないといけないらしい #mybatis

MyBatisでリストで取得するのは簡単

@SelectProvider(type = HogeSqlBuilder::class, method = "selectList")
override fun findAll(): List<Hoge>

MapKey を使うとSelect結果をいい感じにMapにしてくれるMyBatis。

この場合、Hoge.id がKey、ValueHoge のMapにして返してくれる。

@MapKey("id")
@SelectProvider(type = HogeSqlBuilder::class, method = "selectMap")
override fun findAll(): Map<Long, Hoge>

しかしValueはクラスじゃないといけない

たとえば値は Hoge.name だけあればいいような場合に、ValueをStringにしたいのだがそれはできないようだ。

// これはできない
@MapKey("id")
@SelectProvider(type = HogeSqlBuilder::class, method = "selectNameMap")
override fun findAll(): List<id, String>

下記のような例外が発生する。 Stringに対してアクセサを呼び出そうとしてエラーになるようだ。

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'id' in 'class java.lang.String'

対応策

おとなしくクラスを用意するか、リストで受けたあとに自分で詰め替えるとかでしょうね。。

参考

stackoverflow.com qiita.com