使用resultMap在MyBatis中选择查询仅提取一行

时间:2013-04-17 11:12:03

标签: java select mybatis

我们正在使用MyBatis进行我正在进行的项目之一。我在尝试使用resultMap获取结果时遇到问题。

mapper.xml

 <resultMap id="BaseResultMap" type="com.mycompany.myproduct.dto.ChannelMap">
        <id column="CHNL_MAP_ID" property="chnlMapId" jdbcType="DECIMAL" />
        <result column="CHNL_MAP_NM" property="chnlMapNm" jdbcType="VARCHAR" />
        <association property="ctnDlvryPltf"
            resultMap="com.mycompany.myproduct.mapper.ContentDelvryPltfrmMapper.BaseResultMap" />
        <association property="ctnDtr"
            resultMap="com.mycompany.myproduct.mapper.ContentDistributorMapper.BaseResultMap" />
        <association property="region"
            resultMap="com.mycompany.myproduct.mapper.RegionMapper.BaseResultMap" />
    </resultMap>    
    <sql id="Value_Columns_List">
        cmap.CHNL_MAP_NM, cdp.CTN_DLVRY_PLTF_NM,
        cdp.CTN_DLVRY_PLTF_TYP_NM, cdp.CTN_DTR_NM, cd.CTN_DTR_NM,
        cmap.RGN_ID, cmap.CNTRY_ID
    </sql>
    <select id="select" resultMap="BaseResultMap">
        select
        <include refid="Value_Columns_List" />
        FROM
        channel_map cmap,
        (SELECT
        cdpl.ctn_dlvry_pltf_id,cdpl.ctn_dlvry_pltf_nm,
        cdplt.ctn_dlvry_pltf_typ_nm ,cds.ctn_dtr_nm FROM
        content_delvry_pltfrm
        cdpl,
        content_delvry_pltfrm_typ cdplt,
        content_distributor cds
        WHERE
        cdpl.ctn_dlvry_pltf_typ_id =
        cdplt.ctn_dlvry_pltf_typ_id AND
        cdpl.ctn_dtr_id = cds.ctn_dtr_id)
        cdp,
        content_distributor
        cd
        WHERE
        cmap.ctn_dlvry_pltf_id = cdp.ctn_dlvry_pltf_id AND
        cmap.ctn_dtr_id = cd.ctn_dtr_id         
    </select>

上述文件中需要注意的重要事项是,我们通过不同的别名在select查询中两次获取名为CTN_DTR_NM的列(请参阅Value_Columns_List)。这是因为channel_map表包含CTN_DTR_NM。通道映射表还包含对另一个包含CTN_DTR_NM的表的引用。

我面临的问题是即使channel_map表包含多行,select方法也会返回一个只包含一行的List。检查MyBatis日志显示实际查询获取了多行,所有获取的行都显示在日志中。我觉得这个问题与MyBatis提取的结果集映射到我的POJO的方式有关。

1 个答案:

答案 0 :(得分:0)

就使用chnlMapId属性的id标记而言,您要阻止mybatis生成多个具有相同chnlMapId值的对象。 ¿您是否尝试使用结果标记代替chnlMapId属性的id标记?