MyBatisでSQL結果をListで取得するのはとても簡単で、Mapperを使う場合だったら下記のように書けます。
PersonMapper.java
public interface PersonMapper {
@Select("SELECT * FROM people")
List<Person> findAll();
}
でも、場合によってはListじゃなくて、例えばIDなどをキーとしたMapで取得したいこともあると思います。
Streamを使うと、Listで取得した結果からIDをキーとしたMapを作ることができます。
Map<Integer, Person> resultMap = personMapper.findAll().stream()
.collect(Collectors.toMap(Person::getId, v -> v));
これはこれで、「Java8 Stream使ってる俺カッコいい感」感じますけど、ちょっとめんどくさいです。
MyBatisには@MapKeyアノテーションがあって、上記でやったことを簡単に実現できます。
PersonMapper.java
public interface PersonMapper {
@Select("SELECT * FROM people")
List<Person> findAll();
@MapKey("id")
@Select("SELECT * FROM people")
Map<Integer, Person> findAllMap();
}
アノテーションのvalueにはMapのキーとしたいカラム名を設定します。
Mapperのそれぞれのメソッドの結果を出力すると以下になりました。
findAll => [Person(id=1, name=Bob, country=USA), Person(id=2, name=Taro, country=Japan), Person(id=3, name=Zidane, country=France)]
findAllMap => {1=Person(id=1, name=Bob, country=USA), 2=Person(id=2, name=Taro, country=Japan), 3=Person(id=3, name=Zidane, country=France)}
サンプルソース