mybatis主从表关联查询,返回对象带有集合属性

昨天有同事让我帮着看一个问题,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"
		}]
	}]
}
  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot项目中使用MyBatis进行多关联查询的步骤如下: 1. 首先,在pom.xml文件中添加MyBatis的依赖项。可以使用以下代码片段添加依赖项: ``` <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.2</version> </dependency> ``` 2. 创建一个Mapper接口,用于定义多关联查询的方法。在该接口中,使用@Select注解定义SQL查询语句。例如,可以创建一个名为SysUserPrivilegesMapper的接口,并在其中定义多关联查询的方法。 3. 创建一个Mapper XML文件,用于编写SQL查询语句。在该文件中,使用<select>标签定义查询语句,并使用<resultType>标签指定返回结果的类型。例如,可以创建一个名为SysUserPrivilegesMapper.xml的文件,并在其中编写多关联查询的SQL语句。 4. 在Controller类中注入Mapper接口,并在需要进行多关联查询的方法中调用Mapper接口的方法。例如,可以在SysUserPrivilegesController类中注入SysUserPrivilegesMapper接口,并在selectAll()方法中调用Mapper接口的selectAllColumnRole()方法。 这样,当调用selectAll()方法时,就会执行多关联查询,并返回查询结果。 请注意,以上步骤仅为示例,实际使用时需要根据具体的项目需求进行相应的修改和调整。 #### 引用[.reference_title] - *1* [SpringBoot结合mybatis实现多关联查询](https://blog.csdn.net/m0_38004177/article/details/112768314)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [SpringBoot+Mybatis关联查询数据拼接结果集](https://blog.csdn.net/jike11231/article/details/120566272)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值