版权声明:本文为博主原创文章,未经博主允许不得转载。 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实体;