MYBATIS SQL一對多查詢 返回物件或LIST中包含子LIST
MYBATIS SQL一對多查詢 返回物件或LIST中包含子LIST
標籤: mybatis
資料庫對應關係如下圖 : 兩個表的關聯關係 是 store_code 和 sku_code 同時相等
要求查詢結果(圖一)
"list": [
{
"storeCode": "0001",
"skuCode": "0200000306",
"proStatus": 0,
"curNumber": 3,
"batchList": [
{
"id": "b55ad08528bd42049a0ba6effa3e6e1e",
"storeCode": "0001",
"skuCode": "0200000306",
"providerCode": "000002",
"batchNumber": "1906170004",
"price": 5000,
"curNumber": 2
},
{
"id": "f8c5fdc911c841ae8ef4278a504b9a80",
"storeCode": "0001",
"skuCode": "0200000306",
"providerCode": "000017",
"batchNumber": "1907160001",
"price": 2000,
"curNumber": 1
}
]
},
{
"storeCode": "0001",
"skuCode": "52020103",
"proStatus": 0,
"curNumber": 2,
"batchList": [
{
"id": "caca5271355c4139834dc1069a8290ff",
"storeCode": "0001",
"skuCode": "52020103",
"providerCode": "000017",
"batchNumber": "1907160001",
"price": 0,
"curNumber": 2
}
]
}
]
實現方式:
1.建立兩張表對應的實體類:
public class SkuStock { @FieldNote("店程式碼") private String storeCode; @FieldNote("商品SKU編碼") private String skuCode; @FieldNote("促銷狀態:0普通商品1促銷商品") private Integer proStatus; @FieldNote("商品現存") private java.math.BigDecimal curNumber; @FieldNote("需要返回的批次列表") // 返回資料要包含的list private List<SkuStockBatch> batchList; } public class SkuStockBatch { @FieldNote("店程式碼") private String storeCode; @FieldNote("商品SKU編碼") private String skuCode; @FieldNote("供應商編碼") private String providerCode; @FieldNote("批號") private String batchNumber; @FieldNote("零售價") private java.math.BigDecimal price; @FieldNote("商品現存") private java.math.BigDecimal curNumber; }
2. xml檔案resultMap的寫法
<resultMap type="com.a.b.model.sku.SkuStock" id="ResultMap"> <id column="id" property="id" jdbcType="VARCHAR"/> <id column="store_code" property="storeCode" jdbcType="VARCHAR"/> <id column="sku_code" property="skuCode" jdbcType="VARCHAR"/> <id column="pro_status" property="proStatus" jdbcType="INTEGER"/> <id column="no_number" property="noNumber" jdbcType="DECIMAL"/> //property="batchList" ,要與第一步物件中定義的list屬性名稱一樣 <collection property="batchList" resultMap="BatchListResultMap"/> </resultMap> <resultMap type="com.a.b.model.sku.SkuStockBatch" id="BatchListResultMap"> <id column="ssb_id" property="id" jdbcType="VARCHAR"/> <id column="store_code" property="storeCode" jdbcType="VARCHAR"/> <id column="provider_code" property="providerCode" jdbcType="VARCHAR"/> <id column="sku_code" property="skuCode" jdbcType="VARCHAR"/> <id column="batch_number" property="batchNumber" jdbcType="VARCHAR"/> <id column="price" property="price" jdbcType="DECIMAL"/> <!--由於SkuStockBatch表的cur_number和id欄位與主表SkuStock重複 所以去了別名區分解析對映結果--> <id column="ssb_cur_number" property="curNumber" jdbcType="DECIMAL"/> </resultMap>
3.定義一個BathList_Column_List,方便多個查詢sql中引入不必重複寫
<sql id="BathList_Column_List"> ssb.id as ssb_id, ssb.store_code, ssb.provider_code, ssb.sku_code,ssb.batch_number, ssb.price, ssb.cur_number as ssb_cur_number </sql>
4.SQL的寫法,查詢所有的Batch ,幷包含訂單詳情batchList的物件集合,引入前面已經定義好的BathList_Column_List
<select id="findAll" resultMap="ResultMap"> SELECT ss.*,<include refid="BathList_Column_List"/> FROM sku_stock ss left join sku_stock_batch ssb on ssb.store_code=ss.store_code and ssb.sku_code = ss.sku_code order by ss.create_time desc </select>
原文地址 https://i.cnblogs.com/posts/edit