mybatis主從表關(guān)聯(lián)查詢,返回對(duì)象帶有集合屬性解析
主從表關(guān)聯(lián)查詢,返回對(duì)象帶有集合屬性
昨天有同事讓我?guī)椭匆粋€(gè)問題,mybatis主從表聯(lián)合查詢,返回的對(duì)象封裝集合屬性。我先將出現(xiàn)的問題記錄一下,然后再講處理方法也簡單說明一下:
VersionResult為接收返回?cái)?shù)據(jù)對(duì)象
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; //記錄內(nèi)容表的集合對(duì)象 private List<UpdateRecordEntity> UpdateRecordEntityList; }
UpdateRecordEntity為從表數(shù)據(jù)
同樣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寫法,這個(gè)是關(guān)鍵
<!--跟新記錄表封裝的對(duì)象--> <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>
執(zhí)行sql返回的數(shù)據(jù)
頁面調(diào)取接口
下面我將接口數(shù)據(jù)粘貼下來:
{ "code": "0", "msg": "", "data": [{ "id": null, "code": "1419", "createTimes": null, "updateRecordEntityList": [] }, { "id": null, "code": "開發(fā)修改1111", "createTimes": null, "updateRecordEntityList": [] }, { "id": null, "code": "開發(fā)修改1111", "createTimes": null, "updateRecordEntityList": [] }, { "id": null, "code": "開發(fā)修改1111", "createTimes": null, "updateRecordEntityList": [] }, { "id": null, "code": "開發(fā)修改1111", "createTimes": null, "updateRecordEntityList": [] }] }
觀察code、createTimes、updateRecordEntityList三個(gè)屬性,會(huì)發(fā)現(xiàn)只有code字段有值其余的全部為null。分析這個(gè)是為啥呢?找點(diǎn)資料粘貼如下:
發(fā)現(xiàn)是sql數(shù)據(jù)和VersionResult的mapper.xml中映射關(guān)系有點(diǎn)問題,沒有對(duì)應(yīng)起來。resultMap中必須將別名和上面resultMap對(duì)的上就行,很明顯sql返回?cái)?shù)據(jù)的列明沒有和resultMap一一對(duì)應(yīng)起來,因此有了以下對(duì)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>
數(shù)據(jù)顯示正常:
{ ?? ?"code": "0", ?? ?"msg": "", ?? ?"data": [{ ?? ??? ?"code": "1419", ?? ??? ?"createTimes": "2019-09-02 00:00", ?? ??? ?"updateRecordEntityList": [{ ?? ??? ??? ?"moduleName": "安達(dá)市大所", ?? ??? ??? ?"updateContent": "1321321", ?? ??? ??? ?"createTime": "2019-09-02 10:17" ?? ??? ?}] ?? ?}, { ?? ??? ?"code": "開發(fā)修改1111", ?? ??? ?"createTimes": "2019-05-07 00:00", ?? ??? ?"updateRecordEntityList": [{ ?? ??? ??? ?"moduleName": "平臺(tái)111111", ?? ??? ??? ?"updateContent": "平臺(tái)版本第一次更新1", ?? ??? ??? ?"createTime": "2019-08-15 15:07" ?? ??? ?}] ?? ?}, { ?? ??? ?"code": "開發(fā)修改1111", ?? ??? ?"createTimes": "2019-05-07 00:00", ?? ??? ?"updateRecordEntityList": [{ ?? ??? ??? ?"moduleName": "111", ?? ??? ??? ?"updateContent": "111", ?? ??? ??? ?"createTime": "2019-08-16 11:16" ?? ??? ?}] ?? ?}, { ?? ??? ?"code": "開發(fā)修改1111", ?? ??? ?"createTimes": "2019-05-07 00:00", ?? ??? ?"updateRecordEntityList": [{ ?? ??? ??? ?"moduleName": "515", ?? ??? ??? ?"updateContent": "5155", ?? ??? ??? ?"createTime": "2019-08-21 17:29" ?? ??? ?}] ?? ?}, { ?? ??? ?"code": "開發(fā)修改1111", ?? ??? ?"createTimes": "2019-05-07 00:00", ?? ??? ?"updateRecordEntityList": [{ ?? ??? ??? ?"moduleName": "2222", ?? ??? ??? ?"updateContent": "第二次更新", ?? ??? ??? ?"createTime": "2019-08-22 14:23" ?? ??? ?}] ?? ?}] }
mybatis關(guān)聯(lián)查詢(對(duì)象嵌套對(duì)象)
Mybatis 查詢對(duì)象中嵌套其他對(duì)象的解決方法有兩種,
一種是用關(guān)聯(lián)另一個(gè)resultMap的形式
如下:
<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>
一種聯(lián)合查詢 (一對(duì)一)的實(shí)現(xiàn)
但是這種方式有“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>?
以上就是兩種對(duì)象內(nèi)嵌套對(duì)象查詢的實(shí)現(xiàn)。僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot 實(shí)現(xiàn)Http接口加簽、驗(yàn)簽操作方法
這篇文章主要介紹了springboot 實(shí)現(xiàn)Http接口加簽、驗(yàn)簽操作,服務(wù)之間接口調(diào)用,通過簽名作為安全認(rèn)證來保證API的安全性,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-09-09Java?GUI實(shí)現(xiàn)多個(gè)窗口切換效果
這篇文章主要為大家詳細(xì)介紹了Java?GUI實(shí)現(xiàn)多個(gè)窗口的切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04SpringBoot Security密碼加鹽實(shí)例
這篇文章主要為打擊介紹了SpringBoot Security密碼加鹽實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Java實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)學(xué)生管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01SpringBoot項(xiàng)目部署到服務(wù)器上的方法(Jar包)
這篇文章主要介紹了SpringBoot項(xiàng)目部署到服務(wù)器上的方法(Jar包),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Java用Cookie限制點(diǎn)贊次數(shù)(簡版)
最近做了一個(gè)項(xiàng)目,其中有項(xiàng)目需求是,要用cookie實(shí)現(xiàn)限制點(diǎn)贊次數(shù),特此整理,把實(shí)現(xiàn)代碼分享給大家供大家學(xué)習(xí)2016-02-02