mapparにはprefixがあるといいと思う

たとえばこんなテーブルがあったとして


/**********************************/
/* テーブル名: 配送先 */
/**********************************/
CREATE TABLE HAISOUSAKI(
 HAISOUSAKI_ID INTEGER PRIMARY KEY,
 CUSTOMER_NO INTEGER NOT NULL,
 HAISOUSAKI_YUUBIN_NO VARCHAR(16),
 HAISOUSAKI_TODOUFUKEN VARCHAR(16),
 HAISOUSAKI_SIKUCHOUSON VARCHAR(128),
 FOREIGN KEY (CUSTOMER_NO) REFERENCES CUSTOMER (CUSTOMER_NO)
);

/**********************************/
/* テーブル名: 請求先 */
/**********************************/
CREATE TABLE SEIKYUUSAKI(
 SEIKYUUSAKI_ID INTEGER PRIMARY KEY,
 CUSTOMER_NO INTEGER NOT NULL,
 SEIKYUUSAKI_YUUBIN_NO VARCHAR(16),
 SEIKYUUSAKI_TODOUFUKEN VARCHAR(16),
 SEIKYUUSAKI_SIKUCHOUSON VARCHAR(128),
 FOREIGN KEY (CUSTOMER_NO) REFERENCES CUSTOMER (CUSTOMER_NO)
);

こういうエンティティにマッピングする場合は


/**配送先*/
public class Haisousaki {
 private Integer haisousaki_id;
 private Integer customer_no;
 private Address address;

/**請求先*/
public class Seikyuusaki{
 private Integer seikyuusaki_id;
 private Integer customer_no;
 private Address address;

/**アドレス*/
public class Address {
 private String yuubin_no;
 private String todoufuken;
 private String sikuchouson;
 …

こんなマッパーが書けたらいいのになあと思っただけなんです。


<!--配送先の検索-->
<select id="find" parameterType="int" resultMap="haisousakiMap">
select
haisousaki_id,
customer_no,
haisousaki_yuubin_no,
haisousaki_todoufuken,
haisousaki_sikuchouson
from HAISOUSAKI where haisousaki_id = #{id}
</select>

<!--請求先の検索-->
<select id="find" parameterType="int" resultMap="haisousakiMap">
select
seikyuusaki_id,
customer_no,
seikyuusaki_yuubin_no,
seikyuusaki_todoufuken,
seikyuusaki_sikuchouson
from SEIKYUUSAKI where seikyuusaki_id = #{id}
</select>

<!--配送先のresultMap-->
<resultMap id="haisousakiMap" type="firststep.entity.Haisousaki">
<result property="haisousaki_id" column="haisousaki_id"/>
<result property="customer_no" column="customer_no"/>
<association
property="address" column="haisousaki_id"
javaType="firststep.entity.Address"
resultMap="firststep.mapper.COMMONVALUEMapper.addressMap"
prefix="haisousaki_">
</resultMap>

<!--請求先のresultMap-->
<resultMap id="haisousakiMap" type="firststep.entity.Seikyuusaki">
<result property="seikyuusaki_id" column="seikyuusaki_id"/>
<result property="customer_no" column="customer_no"/>
<association property="address"
column="seikyuusaki_id" javaType="
firststep.entity.Address"
resultMap="firststep.mapper.COMMONVALUEMapper.addressMap"
prefix="seikyuusaki_">
</resultMap>

<!--AddressのresultMap-->
<resultMap id="addressMap" type="firststep.entity.Address">
<result property="${prefix}yuubin_no" column="yuubin_no"/>
<result property="${prefix}todoufuken" column="todoufuken"/>
<result property="${prefix}sikuchouson" column="sikuchouson"/>
</resultMap>

SELECT〜ASで指定しろよといわれるかもしれませんが、上記の例でいれば配送先と請求先を同時に結合したときにResultMapが再利用できなくなります。これはいまいちだと思うんですよね。こういう形にしておけば基本的にはResultMapはバリューオブジェクトに対してひとつだけ書き、prefixを使うことでいろいろなクエリで再利用できるんじゃないかなーと思ってみたんですけどね。
マッパーの拡張って簡単にできるんですかね?まだちまちま使ってみているだけなのでなんともいえないですが。そもそもDTDの修正がいる時点で駄目か…