需求:查询订单列表,一个订单 包括订单号,订单id.,订单下的商品列表...等等,订单的商品列表为N个商品,每个商品包括商品的 id ,名称,金额,两个缴费类(商品原因,分为两种费用,数据库字段同一个,缴费类型不同 1,2,所以每个商品其实也是一个两条记录的列表,但需求为 两种费用只要显示在一条记录上即可,即订单下的商品列表 ,没个商品显示信息,商品 id ,名称,费用1,费用2...讲,则需要用行列转换)
collection 标签的property是主查询里面集合的名字,如果有多个就再写个collection,column是子查询参数,单参数直接写主查询结合返回结果,例如直接写上user_id,要是数据库的字段,多条件就封装下,例如
column={orderNo=orderNo,payStatus=payStatus,userId=userId}
,然后子查询的parameterType写"java.util.Map",多条件查询好像只有
mybatis3.0以后才有,看网上资料说的,没验证过,ofType是集合里的对象,select是对应下面的语句
补充:javaType ="java.util.ArrayList" column中的 参数需要collection 上一级sql---myOrderList中查询出来,(orderNo payStatus...)
行列转换中 max()函数 pay_type_code 为类型,不同类型显示不用种类费用,根据此字段显示费用case then 后面的填写费用,然后直接end 无需else 否则会出现只有一直费用是有值的;末尾需要group by 。<!-- 查询我的订单不同状态的订单 -->
<resultMap type="cn.***.dto.MyOrderDto" id="myOrderDto">
<id column="orderId" property="orderId"/>
<result column="orderNo" property="orderNo"/>
<result column="orderCreateTime" property="orderCreateTime"/>
<!-- 推荐教材列表 property: 指的是集合属性的值, ofType:指的是集合中元素的类型 -->
<collection property="orderInfoList" javaType="ArrayList" ofType="cn.****.dto.OrderInfoDto" column="{orderNo=orderNo,payStatus=payStatus,userId=userId}" select="getOrderInfo">
<id column="course_version_id " property="course_version_id "/>
<result column="nName" property="name"/>
<result column="creditsFee" property="creditsFee"/>
<result column="examFee" property="examFee"/>
.........
</collection>
</resultMap>
<select id="queryMyOrderList" parameterType="java.util.Map" resultMap="myOrderDto">
SELECT
T3.order_id orderId,
T3.order_no orderNo,
T3.create_time orderCreateTime,
T3.pay_status payStatus,
T3.create_by userId
FROM
table1 T1
INNER JOIN table2 T2 ON T1.id = T2.finance_order_id
INNER JOIN table3 T3 ON T2.order_no = T3.order_no
WHERE
T1.pay_sys_flag = 0
AND T3.pay_status = #{payStatus}
AND T3.create_by = #{userId}
GROUP BY
T3.order_id
</select>
<select id="getOrderInfo" parameterType="java.util.Map" resultType="cn.***.dto.OrderInfoDto">
SELECT
T1.course_version_id courseVersionId,
T5.`name` name,
MAX(
CASE T1.pay_type_code
WHEN '1' THEN
T1.pay_account
END
) creditsFee,
MAX(
CASE T1.pay_type_code
WHEN '2' THEN
T1.pay_account
END
) examFee,
.
.
.
FROM
table1 T1
INNER JOIN table2 T2 ON T1.id = T2.finance_order_id
INNER JOIN table3 T3 ON T2.order_no = T3.order_no
INNER JOIN table4 T4 ON T1.course_version_id = T4.course_version_id
INNER JOIN table5 T5 ON T5.course_id = T4.course_id
WHERE
T1.pay_sys_flag = 0
AND T3.pay_status = #{payStatus}
AND T3.create_by = #{userId}
AND T3.order_no = #{orderNo}
GROUP BY
T1.course_version_id
</select>