获取多个嵌入对象mybatis

时间:2014-12-04 19:47:35

标签: mybatis

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的新手。任何有助于阐明这一点的帮助都将受到赞赏。

1 个答案:

答案 0 :(得分:4)

在您的查询中,您将加入Region表,而不是Country表,但加入User表,最终返回员工的区域(以及countryRegion对象的Country属性

ResultMapregionResultMap地图中,如下所示:

region_cd -> regionCode
region_nm -> regionName

您正在将region_cd列映射到同一时间的user.assignedCountry.countryRegion.regionCodeuser.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。在此处,belongsToRegion表格中的一列,显示了它所属的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>