1. 程式人生 > 其它 >MYBATIS SQL一對多查詢 返回物件或LIST中包含子LIST

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