mybatis collection 多条件查询 结合mysql行列转换

需求:查询订单列表,一个订单 包括订单号,订单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>

猜你喜欢

转载自blog.csdn.net/qq_35804654/article/details/80775267
今日推荐