Spring Boot / MyBatis / Mapper / select / ResultMap / Many To One

Spring Boot / MyBatis / Mapper / select / ResultMap / Many To One

N:1 の関係性のマッピング。ManyToOne。 つまり結果レコードが増えない関係。

実装としては、これはフィールドに Domain を用いている場合(新たにインスタンスをnewしてセットする状況)となる。 同様に、フィールドに Value Object を採用する場合も同じになる。

このような親子関係(Piyoが親)があるテーブルで子から見て親を含むような結合をした結果を格納したい場合どうするか?

このような Domain を考える

public class Hoge{
    private Long hogeId;
    private Long piyoId;
    private Piyo piyo;
    private String name;
    private String memo;
    // 以下 getter setter
}
public class Piyo{
    private Long piyoId;
    private String name;
    private String memo;
    // 以下 getter setter
}

Hoge が Piyo を1個保持しているような関係。よくありげ

この SQL はこんな感じになる。

  <select id="findByIdWithPiyo" resultMap="hogeResultMapWithPiyo">
    SELECT
        h.hoge_id AS hoge_id,
        h.piyo_id AS piyo_id,
        h.name    AS hoge_name,
        h.memo    AS hoge_memo,
        p.name    AS piyo_name,
        p.memo    AS piyo_memo
    FROM
        hoge h
    LEFT JOIN
        piyo p
        ON
           h.piyo_id = p.piyo_id
    WHERE
        p.hoge_id = #{hogeId}
    LIMIT 1
    ;
  </select>

この結果に対してこのようにマッピングする

<resultMap id="hogeResultMapWithTeam" type="com.unko.domain.Hoge">
  <result property="hogeId" column="hoge_id" />
  <result property="piyoId" column="piyo_id" />
  <result property="name" column="hoge_name"/>
  <result property="memo" column="hoge_memo"/>
  <association property="piyo" javaType="com.unko.domain.Piyo">
    <result property="piyoId" column="piyo_id"/>
    <result property="name" column="piyo_name"/>
    <result property="memo" column="piyo_memo"/>
  </association>
</resultMap>

result 指定でマッピング指定していく。

次にリレーションで引っ張ってきた値に対してもマッピングする。 その時は association というタグを指定する property にはそれを格納するための setter を指定して javaType にはその型を指定する。

中は通常の mapping と同じ様に書く。

これで実行すると、hoge はもちろんその中の piyo も生成されて setPiyo される。

association の書き方にやや注意?があって、剥き出しの result よりも単独で先行して記述できない。 この例なら piyo のマッピング記述を hogeId の result タグよりも前に書くことができない。

value object を採用するように、全フィールドが association になる場合もある。その場合はOK。

java/spring/spring_boot/mybatis/mapper/select/result_map/many_to_one.txt · 最終更新: 2021-06-28 12:53 by ore