menu
書いてる野郎
orebike@gmail.com
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。