亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

mybatis主從表關(guān)聯(lián)查詢,返回對(duì)象帶有集合屬性解析

 更新時(shí)間:2022年03月10日 15:47:40   作者:瘦_猴  
這篇文章主要介紹了mybatis主從表關(guān)聯(lián)查詢,返回對(duì)象帶有集合屬性解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

主從表關(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)文章

  • Java log4j詳細(xì)教程

    Java log4j詳細(xì)教程

    日志是應(yīng)用軟件中不可缺少的部分,Apache的開源項(xiàng)目log4j是一個(gè)功能強(qiáng)大的日志組件,提供方便的日志記錄。在apache網(wǎng)站:jakarta.apache.org/log4j 可以免費(fèi)下載到Log4j最新版本的軟件包
    2015-11-11
  • springboot 實(shí)現(xiàn)Http接口加簽、驗(yà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-09
  • 部署Java在服務(wù)器端的EJB組件的方法

    部署Java在服務(wù)器端的EJB組件的方法

    這篇文章主要介紹了部署Java在服務(wù)器端的EJB組件的方法,同時(shí)給出了簡單的客戶端調(diào)用方法,需要的朋友可以參考下
    2015-11-11
  • Java?GUI實(shí)現(xiàn)多個(gè)窗口切換效果

    Java?GUI實(shí)現(xiàn)多個(gè)窗口切換效果

    這篇文章主要為大家詳細(xì)介紹了Java?GUI實(shí)現(xiàn)多個(gè)窗口的切換效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • SpringBoot Security密碼加鹽實(shí)例

    SpringBoot Security密碼加鹽實(shí)例

    這篇文章主要為打擊介紹了SpringBoot Security密碼加鹽實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Java實(shí)現(xiàn)學(xué)生管理系統(tǒng)

    Java實(shí)現(xiàn)學(xué)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)學(xué)生管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java中方法作為參數(shù)傳遞的方式

    Java中方法作為參數(shù)傳遞的方式

    這篇文章主要介紹了Java如何讓方法作為參數(shù)傳遞,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • Java中==與equals的區(qū)別小結(jié)

    Java中==與equals的區(qū)別小結(jié)

    這篇文章主要介紹了Java中==與equals的區(qū)別小結(jié),本文總結(jié)結(jié)論:== 與 equals()比較的內(nèi)容是不同的,equals()方式是String類中的方法,它用于比較兩個(gè)對(duì)象引用所指的內(nèi)容是否相等,而 == 比較的是兩個(gè)對(duì)象引用的地址是否相等,需要的朋友可以參考下
    2015-06-06
  • SpringBoot項(xiàng)目部署到服務(wù)器上的方法(Jar包)

    SpringBoot項(xiàng)目部署到服務(wù)器上的方法(Jar包)

    這篇文章主要介紹了SpringBoot項(xiàng)目部署到服務(wù)器上的方法(Jar包),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Java用Cookie限制點(diǎn)贊次數(shù)(簡版)

    Java用Cookie限制點(diǎn)贊次數(shù)(簡版)

    最近做了一個(gè)項(xiàng)目,其中有項(xiàng)目需求是,要用cookie實(shí)現(xiàn)限制點(diǎn)贊次數(shù),特此整理,把實(shí)現(xiàn)代碼分享給大家供大家學(xué)習(xí)
    2016-02-02

最新評(píng)論