Mybatis中使用一对多查询实体list重复实体多条显示的方案

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lonyness/article/details/81541100

Mybatis中使用一对多查询实体list重复实体多条显示的方案

本文原创,转载请标明原著地址,尊重原著,谢谢!

一、mybatis实现一对多关联查询返回实体list:

1、首先定义包含连表查询list的相关实体:

public class PlaylistInfoExtendBO extends PlaylistInfoDO{

    private List<MaterialLibraryExtendDO> materialLibraryDOList;

    public List<MaterialLibraryExtendDO> getMaterialLibraryDOList() {
        return materialLibraryDOList;
    }

    public void setMaterialLibraryDOList(List<MaterialLibraryExtendDO> materialLibraryDOList) {
        this.materialLibraryDOList = materialLibraryDOList;
    }

    @Override
    public String toString() {
        return "PlaylistInfoExtendBO{" +
                "materialLibraryDOList=" + materialLibraryDOList +
                '}'+"PlaylistInfoDO{" +
                "id=" + super.toString();
    }
}

2、接下来通过mybatis中的collection进行连表查询出多个实体:

<resultMap id="RpcResult" type="com.startdt.admserver.model.dos.PlaylistInfoExtendBO">
        <id column="ID" property="id" jdbcType="BIGINT" javaType="Long"/>
        <result column="NAME" property="name" jdbcType="VARCHAR" javaType="String"/>
        <result column="CREATOR" property="creator" jdbcType="VARCHAR" javaType="String"/>
        <result column="IS_ACTIVE" property="isActive" jdbcType="INTEGER" javaType="Integer"/>
        <result column="IS_DELETE" property="isDelete" jdbcType="INTEGER" javaType="Integer"/>
        <result column="MODIFIER" property="modifier" jdbcType="VARCHAR" javaType="String"/>
        <result column="GMT_CREATE" property="gmtCreate" jdbcType="TIMESTAMP" javaType="java.util.Date"/>
        <result column="TOTAL_TIME" property="totalTime" jdbcType="BIGINT" javaType="Long"/>
        <result column="MERCHANT_ID" property="merchantId" jdbcType="VARCHAR" javaType="String"/>
        <result column="REMARK_INFO" property="remarkInfo" jdbcType="VARCHAR" javaType="String"/>
        <result column="GMT_MODIFIED" property="gmtModified" jdbcType="TIMESTAMP" javaType="java.util.Date"/>
        <result column="MATERIAL_TOTAL_SIZE" property="materialTotalSize" jdbcType="BIGINT" javaType="Long"/>
        <result column="SINGLE_PICTURE_LENGTH" property="singlePictureLength" jdbcType="INTEGER" javaType="Integer"/>
        <collection property="materialLibraryDOList" resultMap="materialLibraryLs"/>
    </resultMap>

    <resultMap id="materialLibraryLs" type="com.startdt.admserver.model.dos.MaterialLibraryExtendDO">
        <id column="row_no" property="rowNo"/>
        <result column="m_id" property="id" jdbcType="BIGINT" javaType="Long"/>
        <result column="m_small_picture" property="smallPicture"/>
        <result column="m_oss_url" property="ossUrl"/>
        <result column="m_type" property="type"/>
        <result column="m_movie_time" property="movieTime"/>
        <result column="m_name" property="name"/>
    </resultMap>

此处注意:如果关联表对应的实体sql字段定义重复,也即两个表的定义都是id然后查询出来的数据将会是重复单条数据,此时应该对返回字段column进行区分,指定不同的返回定义;

三、以上解决了数据重复出现同一条id的情况,但是还有种情况是如果实体里面的list实体中有重复的实体关联,mybatis会根据实体id重复则默认定义为同一个实体进行去重处理,因此这里的解决方法是定义一个单独字段row_no(数据行数)作为id返回数据,此时可以解决mybatis的去重问题;

<select id="getAllInfoForRpc" resultMap="RpcResult">
        SELECT
        p.*,@rowNO:=@rowNO+1 row_no,m.small_picture m_small_picture,m.oss_url m_oss_url,m.id m_id,m.type m_type,m.movie_time m_moive_time,m.name m_name
        FROM
        advertise_machine.tb_playlist_info p
        left join advertise_machine.tb_playlist_material pm on pm.playlist_id=p.id
        left join advertise_machine.tb_material_library m on m.id=pm.material_id
        ,(select @rowNO:=0) t
        where
        p.id  IN
        <foreach collection="ids" item="item" index="index" open="(" separator="," close=")">
            #{item}
        </foreach>
        <if test="merchantId!=null">
            AND
            p.merchant_id = #{merchantId, jdbcType=VARCHAR}
        </if>
        AND
        p.is_delete = 0
    </select>

最后,该方案成功的解决了mybatis一对多关联查询返回不去重处理的list实体;

猜你喜欢

转载自blog.csdn.net/lonyness/article/details/81541100
今日推荐