昨天有同事让我帮着看一个问题,mybatis主从表联合查询,返回的对象封装集合属性。我先将出现的问题记录一下,然后再讲处理方法也简单说明一下:
VersionResult为接收返回数据对象,get\set方法我这里就省略了。
public class VersionResult extends BaseResult implements Serializable{
private Integer id;
private String code;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
private Date createTimes;
//记录内容表的集合对象
private List<UpdateRecordEntity> UpdateRecordEntityList;
}
UpdateRecordEntity为从表数据,同样get\set方法我这里就省略了。
@Table(name = "z_update_record")
public class UpdateRecordEntity extends BaseEntity {
@Id
private Integer id;
@Column(name = "version_id")
private Integer versionId;
@Column(name = "module_name")
private String moduleName;
@Column(name = "update_content")
private String updateContent;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
@Column(name = "create_time")
private Date createTime;
@Column(name = "is_delete")
private Integer isDelete;
}
mapper.xml写法,这个是关键
<!--跟新记录表封装的对象-->
<resultMap id="BaseResultMap" type="com.wangtiansoft.wisdomedu.persistence.result.server.VersionResult">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="code" property="code" />
<result column="create_time" property="createTimes" />
<collection property="UpdateRecordEntityList" ofType="com.wangtiansoft.wisdomedu.persistence.entity.UpdateRecordEntity">
<id property="id" column="id"/>
<result property="versionId" column="version_id"/>
<result property="moduleName" column="module_name"/>
<result property="updateContent" column="update_content"/>
<result property="createTime" column="create_time"/>
<result property="isDelete" column="is_delete"/>
<result property="tenantId" column="tenant_id"/>
</collection>
</resultMap>
sql查询语句:
<select id="selectVersionList" parameterType="map" resultMap="BaseResultMap">
SELECT
z.`code`,
z.create_time createTimes,
zur.module_name moduleName,
zur.update_content updateContent,
zur.create_time createTime
FROM
z_version z
LEFT JOIN z_update_record zur ON z.id = zur.version_id
WHERE
z.tenant_id = #{tenantId}
AND z.is_delete = 0
AND z.is_disabled = 0
AND zur.tenant_id = #{tenantId}
AND zur.is_delete = 0
AND YEAR(z.create_time)=YEAR(#{date})
ORDER by z.create_time desc
</select>
执行sql返回的数据:
页面调取接口,下面我将接口数据粘贴下来:
{
"code": "0",
"msg": "",
"data": [{
"id": null,
"code": "1419",
"createTimes": null,
"updateRecordEntityList": []
}, {
"id": null,
"code": "开发修改1111",
"createTimes": null,
"updateRecordEntityList": []
}, {
"id": null,
"code": "开发修改1111",
"createTimes": null,
"updateRecordEntityList": []
}, {
"id": null,
"code": "开发修改1111",
"createTimes": null,
"updateRecordEntityList": []
}, {
"id": null,
"code": "开发修改1111",
"createTimes": null,
"updateRecordEntityList": []
}]
}
观察code、createTimes、updateRecordEntityList三个属性,会发现只有code字段有值其余的全部为null。分析这个是为啥呢?找点资料粘贴如下:
发现是sql数据和VersionResult的mapper.xml中映射关系有点问题,没有对应起来。resultMap中必须将别名和上面resultMap对的上就行,很明显sql返回数据的列明没有和resultMap一一对应起来,因此有了以下对xml文件的修改:
<resultMap id="BaseResultMap" type="com.wangtiansoft.wisdomedu.persistence.result.server.VersionResult">
<id column="id" property="id" jdbcType="INTEGER"/>
<result column="code" property="code" />
<result column="createTimes" property="createTimes" />
<collection property="UpdateRecordEntityList" ofType="com.wangtiansoft.wisdomedu.persistence.entity.UpdateRecordEntity">
<id property="id" column="id"/>
<result property="moduleName" column="moduleName"/>
<result property="updateContent" column="updateContent"/>
<result property="createTime" column="createTime"/>
</collection>
</resultMap>
数据显示正常:
{
"code": "0",
"msg": "",
"data": [{
"code": "1419",
"createTimes": "2019-09-02 00:00",
"updateRecordEntityList": [{
"moduleName": "安达市大所",
"updateContent": "1321321",
"createTime": "2019-09-02 10:17"
}]
}, {
"code": "开发修改1111",
"createTimes": "2019-05-07 00:00",
"updateRecordEntityList": [{
"moduleName": "平台111111",
"updateContent": "平台版本第一次更新1",
"createTime": "2019-08-15 15:07"
}]
}, {
"code": "开发修改1111",
"createTimes": "2019-05-07 00:00",
"updateRecordEntityList": [{
"moduleName": "111",
"updateContent": "111",
"createTime": "2019-08-16 11:16"
}]
}, {
"code": "开发修改1111",
"createTimes": "2019-05-07 00:00",
"updateRecordEntityList": [{
"moduleName": "515",
"updateContent": "5155",
"createTime": "2019-08-21 17:29"
}]
}, {
"code": "开发修改1111",
"createTimes": "2019-05-07 00:00",
"updateRecordEntityList": [{
"moduleName": "2222",
"updateContent": "第二次更新",
"createTime": "2019-08-22 14:23"
}]
}]
}