<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
昨天有同事讓我幫著看一個問題,mybatis主從表聯合查詢,返回的物件封裝集合屬性。我先將出現的問題記錄一下,然後再講處理方法也簡單說明一下:
getset方法我這裡就省略了。
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; }
同樣getset方法我這裡就省略了。
@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; }
<!--跟新記錄表封裝的物件--> <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>
<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>
下面我將介面資料貼上下來:
{ "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" }] }] }
Mybatis 查詢物件中巢狀其他物件的解決方法有兩種,
如下:
<association property="office" javaType="Office" resultMap="officeMap"/>
<mapper namespace="com.dixn.oa.modules.sys.dao.RoleDao"> <resultMap type="Office" id="officeMap"> <id property="id" column="id" /> <result property="name" column="office.name" /> <result property="code" column="office.code" /> </resultMap> <resultMap id="roleResult" type="Role"> <id property="id" column="id" /> <result property="name" column="name" /> <result property="enname" column="enname" /> <result property="roleType" column="roleType" /> <result property="dataScope" column="dataScope" /> <result property="remarks" column="remarks" /> <result property="useable" column="useable" /> <association property="office" javaType="Office" resultMap="officeMap"/> <collection property="menuList" ofType="Menu"> <id property="id" column="menuList.id" /> </collection> <collection property="officeList" ofType="Office"> <id property="id" column="officeList.id" /> </collection> </resultMap>
<sql id="roleColumns"> a.id, a.office_id AS "office.id", a.name, a.enname, a.role_type AS roleType, a.data_scope AS dataScope, a.remarks, a.create_by AS "createBy.id", a.create_date, a.update_by AS "updateBy.id", a.update_date, a.del_flag, o.name AS "office.name", o.code AS "office.code", a.useable AS useable, a.is_sys AS sysData </sql>
<select id="get" resultMap="roleResult"> SELECT <include refid="roleColumns"/> rm.menu_id AS "menuList.id", ro.office_id AS "officeList.id" FROM sys_role a JOIN sys_office o ON o.id = a.office_id LEFT JOIN sys_role_menu rm ON rm.role_id = a.id LEFT JOIN sys_role_office ro ON ro.role_id = a.id WHERE a.id = #{id} </select>
但是這種方式有“N+1”的問題,不建議使用
<resultMap id="roleResult" type="Role"> <id property="id" column="id" /> <result property="name" column="name" /> <result property="enname" column="enname" /> <result property="roleType" column="roleType" /> <result property="dataScope" column="dataScope" /> <result property="remarks" column="remarks" /> <result property="useable" column="useable" /> <association property="office" javaType="Office" column="id" select="getOfficeById"/> <collection property="menuList" ofType="Menu"> <id property="id" column="menuList.id" /> </collection> <collection property="officeList" ofType="Office"> <id property="id" column="officeList.id" /> </collection> </resultMap>
<select id="getOfficeById" resultType="Office"> select o.name AS "office.name",o.code AS "office.code" from sys_office o where o.id = #{id} </select>
以上就是兩種物件內巢狀物件查詢的實現。僅為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45