问题:当涉及四个表的查询时,会产生大量的笛卡尔积导致内存溢出。
解决办法 :可以使用嵌套查询将多表的联合查询拆分为单个表的查询,使用resultmap中的association(适合一对一) 或 collection(一对多) 来实现封装。
association(适合一对一) 或 collection(一对多)的理解可以参考这个 , 思想容易懂
http://t.csdnimg.cn/itH1Lhttp://t.csdnimg.cn/itH1L
<resultMap type="NodeVo" id="NodeVoResult"><result property="id" column="id" /><result property="nodeName" column="node_name" /><result property="address" column="address" /><result property="businessType" column="business_type" /><result property="regionId" column="region_id" /><result property="partnerId" column="partner_id" /><result property="createTime" column="create_time" /><result property="updateTime" column="update_time" /><result property="createBy" column="create_by" /><result property="updateBy" column="update_by" /><result property="remark" column="remark" /><result property="vmCount" column="vm_count" />
<!-- property 对应实体类的字段 javatype对应这个字段的类型 column对应查询对应的条件 select 对应查询的方法,全路径 -->
<!-- 为了防止多表联查产生大量笛卡尔积导致内存溢出,使用嵌套查询--><association property="region" javaType="Region" column="region_id" select="com.dkd.manage.mapper.RegionMapper.selectRegionById"/><association property="partner" javaType="Partner" column="partner_id" select="com.dkd.manage.mapper.PartnerMapper.selectPartnerById"/></resultMap>
<select id="selectNodeVoList" resultMap="NodeVoResult">SELECTn.id,n.node_name,n.address,n.business_type,n.region_id,n.partner_id,n.create_time,n.update_time,n.create_by,n.update_by,n.remark,COUNT(v.id) AS vm_countFROMtb_node nLEFT JOINtb_vending_machine v ON n.id = v.node_id<where>
-- 字段名不唯一的时候一定指定是哪个表的字段<if test="nodeName != null and nodeName != ''"> and n.node_name like concat('%', #{nodeName}, '%')</if><if test="regionId != null "> and n.region_id = #{regionId}</if><if test="partnerId != null "> and n.partner_id = #{partnerId}</if></where>GROUP BYn.id</select>