ibatis中如何解决inner join的查询结果映射

bigdata-sb 2014-04-08 11:40:26

public class Staff {
private Integer id;
private String name;
private Depart depart;
//..省略getter/setter方法
}
public class Depart {
private Integer id;
private String name;
//..省略getter/setter方法
}


staff和depart是多对一的关系,现在我想通过一条sql查询staff的时候顺便把depart查出来,
配置如下

<resultMap class="staff" id="staff_base_map">
<result property="id" column="staff_id"/>
<result property="name" column="staff_name"/>
<result property="depart" column="???" />
</resultMap>


<select id="load" parameterClass="java.lang.Integer" resultMap="staff_base_map">
select s.id staff_id,s.name staff_name,d.id depart_id,d.name depart_name
from t_staff s inner join t_depart d on s.depart_id = d.id
where s.id = #id#
</select>

<--
这个depart不知道怎么映射
有试过
<result property="depart.id" column="depart_id" />
<result property="depart.id" column="depart_id" />
但是报错..
也有试过
<result property="depart.id" resultMap="depart_base_map" />
<resultMap class="depart" id="depart_base_map">
<result property="id" column="departId"/>
<result property="name" column="departname"/>
</resultMap>
这样也错,

-->


求各位帮忙解答一下,小弟万分感谢
...全文
343 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigdata-sb 2014-04-09
  • 打赏
  • 举报
回复
引用 1 楼 Inhibitory 的回复:
主要就是result map, association, collection, columnPrefix等 下面的这个例子里几乎都有了,可以参考一下。
<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper PUBLIC
        "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--namespace非常重要:必须是Mapper类的全路径-->
<mapper namespace="com.tur.mapper.UserMapper">
    <sql id="columns">id, age, name</sql>

    <!-- [[1]] 简单的JavaBean,直接使用resultType: 数据库表的列与JavaBean的属性对应 -->
    <select id="selectUser" parameterType="int" resultType="User">
        SELECT <include refid="columns"/>
        FROM user WHERE id = #{id}
    </select>

    <select id="selectUserByMap" parameterType="map" resultType="User">
        SELECT <include refid="columns"/>
        FROM user WHERE id = #{id} AND name=#{name}
    </select>

    <select id="selectUsersByName" parameterType="string" resultType="com.tur.domain.User">
        SELECT <include refid="columns"/>
        FROM user WHERE name = #{name}
    </select>

    <!-- [[2]] 可以使用resultMap映射自己的类: 例如多表查询时 -->
    <select id="selectUserById" parameterType="int" resultMap="userResultMap">
        SELECT <include refid="columns"/>
        FROM user WHERE id = #{id}
    </select>

    <select id="selectUserByIdWithParam" resultMap="userResultMap">
        SELECT <include refid="columns"/>
        FROM user WHERE id = #{id} limit #{offset},#{size}
    </select>

    <resultMap id="userResultMap" type="com.tur.domain.User">
        <id property="id" column="id"/>
        <result property="age" column="age"/>
        <result property="name" column="name"/>
    </resultMap>


    <!-- [[3]] 使用resultMap映射,属性是另一个类的对象 -->
    <select id="selectFullUserById" parameterType="int" resultMap="userAssociationResultMap">
        SELECT
            user.id         as user_id, <!-- 重命名列非常有用 -->
            user.age        as user_age,
            user.name       as user_name,
            ui.id           as user_info_id,
            ui.user_id      as user_info_user_id,
            ui.telephone    as user_info_telephone,
            ui.address      as user_info_address
        <!--FROM user, user_info ui-->
        FROM user
            LEFT JOIN user_info ui ON user.id=ui.user_id
        WHERE user.id=#{id}
            <!--AND user.id=ui.user_id-->
    </select>
    <resultMap id="userAssociationResultMap" type="com.tur.domain.User">
        <id     property="id"   column="user_id"/>
        <result property="age"  column="user_age"/>
        <result property="name" column="user_name"/>
        <!--嵌套映射中还可以使用resultMap: association, collection
        还可以使用嵌套查询,但是会产生N+1问题,在大数量的数据库里会有很大的性能问题-->
        <!--<association property="userInfo" column="user_info_id" javaType="domain.UserInfo">
            <id     property="id"        column="user_info_id"/>
            <result property="userId"    column="user_info_user_id"/>
            <result property="telephone" column="user_info_telephone"/>
            <result property="address"   column="user_info_address"/>
        </association>-->
        <!--association是一对一关系,collection是一对多关系-->
        <!--使用columnPrefix可以使result map重用-->
        <!--column用在嵌套查询的时候有用,下面的嵌套结果resultMap情形可以不用-->
        <association property="userInfo" column="user_info_id" columnPrefix="user_info_" resultMap="userInfoResultMap"/>
    </resultMap>
    <resultMap id="userInfoResultMap" type="com.tur.domain.UserInfo">
        <id     property="id"        column="id"/>
        <result property="userId"    column="user_id"/>
        <result property="telephone" column="telephone"/>
        <result property="address"   column="address"/>
    </resultMap>

    <select id="selectUsersWithNames" parameterType="list" resultType="com.tur.domain.User">
        SELECT  <include refid="columns"/>
        FROM    user
        WHERE   name in
        <foreach item="item" index="index" open="(" separator="," close=")" collection="list">
            #{item}
        </foreach>
    </select>
</mapper>

非常谢谢你回复这么多,不过我用的是ibatis里面没有collections 、association 这里元素。。。resultMap里面只有一个result和discriminator。。。
Inhibitory 2014-04-08
  • 打赏
  • 举报
回复
主要就是result map, association, collection, columnPrefix等 下面的这个例子里几乎都有了,可以参考一下。
<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE mapper PUBLIC
        "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--namespace非常重要:必须是Mapper类的全路径-->
<mapper namespace="com.tur.mapper.UserMapper">
    <sql id="columns">id, age, name</sql>

    <!-- [[1]] 简单的JavaBean,直接使用resultType: 数据库表的列与JavaBean的属性对应 -->
    <select id="selectUser" parameterType="int" resultType="User">
        SELECT <include refid="columns"/>
        FROM user WHERE id = #{id}
    </select>

    <select id="selectUserByMap" parameterType="map" resultType="User">
        SELECT <include refid="columns"/>
        FROM user WHERE id = #{id} AND name=#{name}
    </select>

    <select id="selectUsersByName" parameterType="string" resultType="com.tur.domain.User">
        SELECT <include refid="columns"/>
        FROM user WHERE name = #{name}
    </select>

    <!-- [[2]] 可以使用resultMap映射自己的类: 例如多表查询时 -->
    <select id="selectUserById" parameterType="int" resultMap="userResultMap">
        SELECT <include refid="columns"/>
        FROM user WHERE id = #{id}
    </select>

    <select id="selectUserByIdWithParam" resultMap="userResultMap">
        SELECT <include refid="columns"/>
        FROM user WHERE id = #{id} limit #{offset},#{size}
    </select>

    <resultMap id="userResultMap" type="com.tur.domain.User">
        <id property="id" column="id"/>
        <result property="age" column="age"/>
        <result property="name" column="name"/>
    </resultMap>


    <!-- [[3]] 使用resultMap映射,属性是另一个类的对象 -->
    <select id="selectFullUserById" parameterType="int" resultMap="userAssociationResultMap">
        SELECT
            user.id         as user_id, <!-- 重命名列非常有用 -->
            user.age        as user_age,
            user.name       as user_name,
            ui.id           as user_info_id,
            ui.user_id      as user_info_user_id,
            ui.telephone    as user_info_telephone,
            ui.address      as user_info_address
        <!--FROM user, user_info ui-->
        FROM user
            LEFT JOIN user_info ui ON user.id=ui.user_id
        WHERE user.id=#{id}
            <!--AND user.id=ui.user_id-->
    </select>
    <resultMap id="userAssociationResultMap" type="com.tur.domain.User">
        <id     property="id"   column="user_id"/>
        <result property="age"  column="user_age"/>
        <result property="name" column="user_name"/>
        <!--嵌套映射中还可以使用resultMap: association, collection
        还可以使用嵌套查询,但是会产生N+1问题,在大数量的数据库里会有很大的性能问题-->
        <!--<association property="userInfo" column="user_info_id" javaType="domain.UserInfo">
            <id     property="id"        column="user_info_id"/>
            <result property="userId"    column="user_info_user_id"/>
            <result property="telephone" column="user_info_telephone"/>
            <result property="address"   column="user_info_address"/>
        </association>-->
        <!--association是一对一关系,collection是一对多关系-->
        <!--使用columnPrefix可以使result map重用-->
        <!--column用在嵌套查询的时候有用,下面的嵌套结果resultMap情形可以不用-->
        <association property="userInfo" column="user_info_id" columnPrefix="user_info_" resultMap="userInfoResultMap"/>
    </resultMap>
    <resultMap id="userInfoResultMap" type="com.tur.domain.UserInfo">
        <id     property="id"        column="id"/>
        <result property="userId"    column="user_id"/>
        <result property="telephone" column="telephone"/>
        <result property="address"   column="address"/>
    </resultMap>

    <select id="selectUsersWithNames" parameterType="list" resultType="com.tur.domain.User">
        SELECT  <include refid="columns"/>
        FROM    user
        WHERE   name in
        <foreach item="item" index="index" open="(" separator="," close=")" collection="list">
            #{item}
        </foreach>
    </select>
</mapper>

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧