mybatis - mybatis获取多个嵌入对象

标签 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 非常陌生。任何有助于阐明这一点的帮助将不胜感激。

最佳答案

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

在您的 ResultMap 中,regionResultMap 映射如下:

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>

关于mybatis - mybatis获取多个嵌入对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27302718/

相关文章:

java - 打印 Java 中的值

java - 使用带有注解的MyBatis如果发生MySql错误则抛出自己的自定义异常

java - Mybatis - 从 SELECT 返回包含 Hashmap 的对象

java - mybatis 不返回延迟获取的所有行

jquery - 使用 Jquery ajax() 调用,Tomcat 日志静默

java - 从缓存反序列化数据时出现 ClassNotFoundException

java - 我可以在切换到 myBatis 的同时将 iBatis 和 Mybatis 保持在同一个应用程序中吗?

spring - mybatis-spring 1.2.0 中的 Autowiring

java - MyBatis 中未使用存储过程将数据插入数据库

java - MyBatis Java boolean 值到 Sql 枚举