Java--Mybatis一个实体内部嵌套两个或多个相同类型实例对象

Posted MinggeQingchun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java--Mybatis一个实体内部嵌套两个或多个相同类型实例对象相关的知识,希望对你有一定的参考价值。

需求:有一个用户User表,属性包含两个对象,一个人事部 hr对象(Dept实体对象);

一个财务部 financial(Dept实体对象),通过hrId,和 financialId 分别查询到 hr,和 financial两个对象,根据其相应主键 ID 获取其 name 名称,code 编码字段

User实体类对象如下:

public class User extends BaseEntity
{
    private static final long serialVersionUID = 1L;

    /** User信息ID */
    @Id
    private Long userId;

    /** 人事部ID(Dept部门对象) */
    private Long hrId;

    /** 财务部ID(Dept部门对象)*/
    private Long financialId;

    /**
     * 人事部对象
     */
    @ApiModelProperty(value = "人事部对象")
    private Dept hr;

    /**
     * 财务部对象
     */
    @ApiModelProperty(value = "财务部对象")
    private Dept financial;

    public void setUserId(Long userId) 
    {
        this.userId = userId;
    }

    public Long getUserId() 
    {
        return userId;
    }

    public void setHrId(Long hrId) 
    {
        this.hrId = hrId;
    }

    public Long getHrId() 
    {
        return hrId;
    }

    public void setFinancialId(Long financialId) 
    {
        this.financialId = financialId;
    }

    public Long getFinancialId() 
    {
        return financialId;
    }

    public Dept getHr() {
        return hr;
    }

    public void setHr(Dept hr) {
        this.hr = hr;
    }

    public Dept getFinancial() {
        return financial;
    }

    public void setFinancial(Dept financial) {
        this.financial = financial;
    }
    }
}

mapper.xml 文件代码如下:

<mapper namespace="com.xx.mapper.UserMapper">

    <!--User表映射-->
    <resultMap type="User" id="UserResult">
        <result property="userId"    column="user_id"    />
        <result property="hrId"    column="hr_id"    />
        <result property="financialId"    column="financial_id"    />

        <!-- 获取人事部对象(Dept对象) -->
        <association property="hr" column="hr_id" javaType="Dept" select="getHr" />
        <!-- 获取财务部对象(Dept对象) -->
        <association property="financial" column="financial_id" javaType="Dept" select="getFinancial" />
    </resultMap>


    <!-- Dept表映射 -->
    <resultMap type="Dept" id="DeptResult">
        <result property="deptId"    column="dept_id"    />
        <result property="code"    column="code"    />
        <result property="name"    column="name"    />
    </resultMap>

    <!-- sql查询语句 -->
    <sql id="selectUserVo">
        select user.user_id,
               user.hr_id,
               user.financial_id
        from User user
    </sql>


    <!-- 获取人事部对象(Dept对象) -->
    <select id="getHr" parameterType="Long" resultMap="DeptResult">
        select hr.dept_id,
               hr.code,
               hr.name
        from Dept hr where
                dept_id = #{hrId}
    </select>

    <!-- 获取财务部对象(Dept对象) -->
    <select id="getFinancial" parameterType="Long" resultMap="DeptResult">
        select financial.dept_id,
               financial.code,
               financial.name
        from Dept financial where
            dept_id = #{financialIdId}
    </select>

    <!-- 获取User列表 -->
    <select id="selectUserList" parameterType="User" resultMap="UserResult">
        <include refid="selectUserVo"/>
        <where>  
            <if test="userId != null "> and user_id = #{userId}</if>
        </where>
    </select>
>

在User实体类中嵌套这两个对象,分别是:hr 和 financial,而我们要做的就是将在查询User这个对象的时候通过 hrId 和 financialId 这两个外键查询 hr 和 financial 这两个对象

association: 复杂对象的映射
property: 映射到Order实体类中的receiveUser
column : 这个其实就是你要传的参数名
javaType: 一个 Java 类的完全限定名

整个查询操作流程:

1、数据库依据下面的代码查找User对象,然后将对象映射到 UserResult 结果集中 

<!-- 获取User列表 -->
    <select id="selectUserList" parameterType="User" resultMap="UserResult">
        <include refid="selectUserVo"/>
        <where>  
            <if test="userId != null "> and user_id = #{userId}</if>
        </where>
    </select>

 2、在UserResult中有以下association复杂对象的映射,select="getHr" (关键步骤);即

<!-- 获取人事部对象(Dept对象) -->
<association property="hr" column="hr_id" javaType="Dept" select="getHr" />

<!-- 获取财务部对象(Dept对象) -->
<association property="financial" column="financial_id" javaType="Dept" select="getFinancial" />

3、系统会通过 select 的属性值即 getHr 跳转到 id="getHr" 的xml中,并将column中的 hr_id 映射字段中的值 hrId 传递过去,赋值给 dept_id(关键步骤),即

    <!-- 获取人事部对象(Dept对象) -->
    <select id="getHr" parameterType="Long" resultMap="DeptResult">
        select hr.dept_id,
               hr.code,
               hr.name
        from Dept hr where
                dept_id = #{hrId}
    </select>

    <!-- 获取财务部对象(Dept对象) -->
    <select id="getFinancial" parameterType="Long" resultMap="DeptResult">
        select financial.dept_id,
               financial.code,
               financial.name
        from Dept financial where
            dept_id = #{financialIdId}
    </select>

在查询到 hr 对象之后会将对象放入hr, financial对象同理!

以上是关于Java--Mybatis一个实体内部嵌套两个或多个相同类型实例对象的主要内容,如果未能解决你的问题,请参考以下文章

嵌套事务 DbContext SaveChanges 引发异常

在所有嵌套实体中选择几个:SPRING JPA

HBase - 如何在表中嵌套两个(+)级别的实体?

我可以嵌套(组合)两个共享相同角色的实体吗?甲骨文

Java MyBatis Generator使用generator自动生成Dao,Mapping和实体文件

Spring:嵌套实体保存空值问题