关于mybatis中collection嵌套查询问题总结

问题描述

mybatis分页查询,使用了collection进行一对多关联时,出现分页不正确的问题
订单分页
分页的每页记录数pageSize=5,如图查询结果首页只有4条订单数据.

分析原因

在订单查询中,涉及订单和订单流水两张表,一个订单对应一个或多个流水
OrderMapper.xml中使用collection进行嵌套查询
错误写法:

<resultMap type="Order" id="ContractDetailed">
    <result property="orderNo" column="orderNo" />
    <result property="sumMoney" column="sumMoney" />
    <result property="couponAmount" column="couponAmount" />
    <result property="createTime" column="createTime" />
    <result property="payTime" column="payTime" />
    <result property="states" column="states" />
    <result property="payType" column="payType" />
    <result property="orderId" column="orderId" />
    <result property="orderType" column="orderType" />
    <collection property="trxorderDetailList" ofType="TrxorderDetailDTO">
        <result column="trxorderDetailId" property="trxorderDetailId" />
        <result column="courseId" property="courseId" />
        <result column="currentPrice" property="currentPirce" />
        <result column="courseName" property="courseName" />
    </collection>
</resultMap>

<select id="queryOrderForUc" resultMap="ContractDetailed" parameterType="java.util.HashMap">
    SELECT
        <include refid="orders_columns" />
    FROM 
        edu_orders
    LEFT JOIN 
        edu_trxorder_detail ON edu_orders.ORDER_ID = edu_trxorder_detail.trxorder_id
</select>

正确写法:

<resultMap id="ContractDetailed" type="Order">
    <result property="orderNo" column="orderNo" />
    <result property="sumMoney" column="sumMoney" />
    <result property="couponAmount" column="couponAmount" />
    <result property="createTime" column="createTime" />
    <result property="payTime" column="payTime" />
    <result property="states" column="states" />
    <result property="payType" column="payType" />
    <result property="orderId" column="orderId" />
    <result property="orderType" column="orderType" />
    <collection property="trxorderDetailList" ofType="TrxorderDetailDTO" column="trxorder_id"  select="getDetailInfoByOrderId"></collection>
</resultMap>

<select id="queryOrderForUc" resultMap="ContractDetailed" parameterType="java.util.HashMap">
    SELECT
        <include refid="orders_columns" />
    FROM edu_orders
</select>

<resultMap id="detailInfoMap" type="TrxorderDetailDTO">
    <id column="trxorder_id" property="id"/>
    <result column="courseId" property="courseId" />
    <result column="currentPrice" property="currentPirce" />
    <result column="courseName" property="courseName" />
</resultMap>

<select id="getDetailInfoByOrderId" parameterType="java.lang.Long" resultMap="detailInfoMap">
    SELECT
        <include refid="trxorder_detail_columns" />
    FROM
        edu_trxorder_detail
     WHERE 
         edu_trxorder_detail.trxorder_id=#{id}
</select>

总结

当使用MyBatis进行查询的时候如果一个 JavaBean 中包含另一个 JavaBean 或者 Collection 时,可以通过 MyBatis 的嵌套查询来获取需要的结果;
① Collection 同一个查询映射到属性的嵌套
  如果在一个查询中可以直接查询到所需要的数据,但是需要映射到该对象的属性上,则可以使用该方式.
  但在分页时,它会将collection中查询到的条数作为分页约束,从而出现分页不正确的问题
② Collection 一个查询调用另一个查询实现的嵌套
  collection : 一个复杂的类型关联,许多结果将映射为这种类型
  property : 这是关联的 JavaBean 中的属性名
  javaType : property 属性对应的集合类型
  ofType : property 集合中的泛型
  column : RoleModel 的 id ,作为参数传入被调用的 Select 语句
  select : 另外一个映射语句的 ID


 上一篇
Spring Boot项目中使用JSP Spring Boot项目中使用JSP
Spring Boot 的默认视图支持是 Thymeleaf 模板引擎,但是想使用我们熟悉的JSP怎么办? 一.如何配置JSP1. pom.xml中增加对 JSP 文件的支持servlet依赖 <dependency>
2019-03-05 linhai
下一篇 
个人博客-初体验 个人博客-初体验
人需要沉淀,要有足够的时间去反思,才能让自己变得更完美本博客基于 Hexo 的 hexo-theme-matery主题搭建
2019-03-01 linhai
  目录