mybatis collection 多條件查詢 結合mysql行列轉換
阿新 • • 發佈:2019-02-10
需求:查詢訂單列表,一個訂單 包括訂單號,訂單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>