3
回答
Mysql-Mybatis-resultMap嵌套-同一级出现两组一对多时查询出现问题
华为云实践训练营,热门技术免费实践!>>>   

大家好,我在做一个分页查询的时候,需求上其中一个对象属性由一对一关系变成一对多关系,然后就出现查询各种异常情况了。

 

下面是我的resultMap 嵌套配置:

sql查询:

DTO代码:


 现在的情况是:执行这个查询,订单对应的档期信息,订单对应的审核信息,订单对应的广告位信息,广告位对应的档期信息都能映射进去;

但是数据查询有遗漏,不作任何条件过滤本来是4条数据的,但是只能查出来3条;

 我试着添加被遗漏的数据的定位查询,又可以拿到这条数据,信息也正确;

然后我还试了调换sql查询的位置,我把对审核信息的left join 放到 广告位信息left join的 下面去查询,结果又不一样了,只查出来两条数据。

另外一个情况时:之前这个订单与审核信息的对应关系是一对一的,没有任何过滤条件的查询和带有过滤条件的查询记录都正常,现在改成一对多就来问题了;

相当于之前订单信息这一层只有一组一对多没事,两组就不懂怎么成这样了?

跪求大家给个解决方案,来点意见!!

举报
fgod
发帖于1年前 3回/655阅
共有3个答案 最后回答: 1年前
建议不要太多的join,可以在业务层处理。毕竟分页时,一页数据就十多条。一个个循环处理也可以。另外也可以考虑用搜索引擎

引用来自“风中蜡烛”的评论

建议不要太多的join,可以在业务层处理。毕竟分页时,一页数据就十多条。一个个循环处理也可以。另外也可以考虑用搜索引擎

我现在使用懒加载可以正常查询了;性能问题我太菜,然后这么多循环放业务里,不是要建立好多次数据库链接查询吗?我这样处理后,我看日志内容是先拿出来list订单列表信息,然后再循环执行懒加载sql,实际也就是循环查询关联信息了,这样处理能行吗?

<!-- 订单列表数据-->

    <resultMap id="orderPage" type="cn.ycmedia.wangcheng.xinhua.DTO.OrdersPage">
        <!-- id 必须配置,订单表基本信息-->
        <id property="id" column="Id"/>
        <result property="orderName" column="OrderName"/>
       
        <!-- 订单档期-->
        <association property="orderShowDate" resultMap="orderShowDateMap">
        </association>
        <!-- 审核信息-->
        <collection property="orderCheckInfos" column="Id"
                    select="orderCheckInfoLazyLoading" ofType="OrderCheckInfoModel">
        </collection>
        <!-- 广告位-->
        <collection property="orderADSpaces" column="Id"
                    select="orderADSpacesLazyLoading" ofType="OrderADSpaceModel">
        </collection>
    </resultMap>
    <!-- 订单档期-->
    <resultMap id="orderShowDateMap" type="OrderShowDate">
        <!-- id必须配置,一个订单有一个统筹的档期-->
        <id property="id" column="orderSHId"/>
        <result property="startDate" column="oStartDate"/>
        <result property="endDate" column="oEndDate"/>
    </resultMap>
    <!-- 审核信息-->
    <resultMap id="orderCheckInfoMap" type="OrderCheckInfoModel">
        <id property="id" column="InfoId"/>
        <result property="orderId" column="OrderId"/>
    </resultMap>
    <!-- 广告位-->
    <resultMap id="orderADSpacesMap" type="OrderADSpaceModel">
        <!-- id必须配置,一个订单可以添加多个广告位-->
        <id property="id" column="adId"/>
        <result property="adSpaceId" column="ADSpaceId"/>       
        <!-- 广告位具体档期-->
        <collection property="adShowDates" resultMap="orderADShowDateMap">
        </collection>
    </resultMap>
    <!-- 广告位档期-->
    <resultMap id="orderADShowDateMap" type="OrderADShowDate">
        <!-- id必须配置,一个广告位可以多个具体档期-->
        <id property="id" column="adSHId"/>
        <result property="startDate" column="adStartDate"/>
        <result property="endDate" column="adEndDate"/>
    </resultMap>
   
    <select id="orderCheckInfoLazyLoading" parameterType="int" resultMap="orderCheckInfoMap">
        SELECT ch.Id as InfoId,ch.CheckStep,ch.CheckName,bu.TrueName as CheckUser
        from OrderCheckInfo ch
        LEFT JOIN BUsers bu ON ch.CheckUserId = bu.Id
        WHERE ch.OrderId = #{VALUE } and ch.State = 0
    </select>
    <select id="orderADSpacesLazyLoading" parameterType="int" resultMap="orderADSpacesMap">
        SELECT
        ad.Id as adId,ad.Price as adPrice,
        adsh.Id as adSHId,adsh.StartDate adStartDate,adsh.EndDate adEndDate
        FROM OrderADSpace ad
        LEFT JOIN ADSpace ads ON ad.ADSpaceId = ads.Id
        LEFT JOIN OrderADShowDate adsh ON adsh.OrderId = #{VALUE} and adsh.ADSpaceId = ad.ADSpaceId
        WHERE ad.OrderId = #{VALUE}
    </select>
    <select id="getOrdersList" parameterType="cn.ycmedia.wangcheng.xinhua.DTO.OrdersListConditions"
            resultMap="orderPage">
        select DISTINCT  o.Id,o.OrderName   
        <where>
            1=1
        </where>
        order by o.Id DESC
        limit #{recordStart},#{pageSize}
    </select>



顶部