问题描述
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