1. 程式人生 > >mybatis collection 多條件查詢 結合mysql行列轉換

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>