Class User{
private String employeeId;
private Country assignedCountry;
private Region employeeRegion;
//getter & setter
}
Class Country{
private String countryCode;
private Region countryRegion;
//getter & setter methods
}
Class Region{
private String regionCode;
}
<resultMap type="User" id="userResultMap">
<id column="employee_id" property="employeeId" />
<association property="assignedCountry" resultMap="countryResultMap"/>
<association property="employeeRegion" resultMap="regionResultMap"/>
</resultMap>
<resultMap type="Country" id="countryResultMap">
<id column="country_cd" property="countryCode" />
<association property="countryRegion" resultMap="regionResultMap"/>
</resultMap>
<resultMap type="Region" id="regionResultMap">
<id column="region_cd" property="regionCode" />
<id column="region_nm" property="regionName" />
</resultMap>
员工被分配到一个国家,也属于一个地区。 国家/地区属于某个地区,该地区可能与员工的地区相同或不同。
该查询将获取分配了国家和地区的用户。
select U.*, C.*, R.* from
User U left outer join Country C
on U.assigned_country_cd = C.country_cd
left outer join Region R
on U.employee_region_cd = R.region_cd
当我通过mybatis执行查询并检查用户对象时,我可以看到用户区域设置正确。 但是我也可以看到用户所在国家/地区内的Region对象也设置为用户的区域。哪个不应该是这样的。 (我知道我不会在这里获取国家/地区。但如果是这样,则不应该设置此对象,而不是将员工区域设置为国家/地区区域)
有人可以帮助我如何在国家/地区对象中映射国家/地区吗?
我是mybatis和ORM的新手。任何有助于阐明这一点的帮助都将受到赞赏。
答案 0 :(得分:4)
在您的查询中,您将加入Region
表,而不是Country
表,但加入User
表,最终返回员工的区域(以及countryRegion
对象的Country
属性。
在ResultMap
,regionResultMap
地图中,如下所示:
region_cd -> regionCode
region_nm -> regionName
您正在将region_cd
列映射到同一时间的user.assignedCountry.countryRegion.regionCode
和user.employeeRegion.regionCode
,它们基本上将相同的列设置为相同的属性不同的对象。
你能做什么是在SQL中区分用户的区域和国家/地区的区域,并相应地在MyBatis中进行映射:
添加另一个连接以连接区域与国家/地区:
select U.*, C.*, R.*, CR.region_cd AS C_region_cd, CR.region_nm as C_region_nm from
User U left outer join Country C
on U.assigned_country_cd = C.country_cd
left outer join Region R
on U.employee_region_cd = R.region_cd
left outer join Region CR
on CR.belongsTo = C.country_cd
并且,您需要更改ResultMap
,如下所示,以便使用具有不同列名的相同ResultMap
。在此处,belongsTo
是Region
表格中的一列,显示了它所属的Country
:
<resultMap type="User" id="userResultMap">
<id column="employee_id" property="employeeId" />
<association property="assignedCountry" resultMap="countryResultMap"/>
<association property="employeeRegion" resultMap="regionResultMap"/>
</resultMap>
<resultMap type="Country" id="countryResultMap">
<id column="country_cd" property="countryCode" />
<association columnPrefix="C_" property="countryRegion" resultMap="regionResultMap"/>
</resultMap>
<resultMap type="Region" id="regionResultMap">
<id column="region_cd" property="regionCode" />
<id column="region_nm" property="regionName" />
</resultMap>