處理mybaits中使用pageHelper 進行一對多分頁時結果不對,以及對象包含的list結果為空


1.pageHelper遇到resultMap的collection后,分頁總數不對(詳情請看我上一篇博客 ----- mybatis sql一對多查詢 返回對象或list中包含子list)
原因:由於PageHelper分頁總數是根據count(0)來計算出來的

(即自動生成一條SQL select count(0) from xx where 篩選條件),而collection會把結果集合並(一對多的情況),計算總數在合並結果集之前,所以計算的總數不對。

下面sql就是統計了合並結果集之前的總數。

<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>

<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>

<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>

2.處理方法  

可以使用嵌套查詢的方式;

由於我的子查詢條件是多個參數,所以嵌套查詢的改造還是有些波折。

剛開始改造 cloumn傳給子查詢的參數只有一個,所以出現子集查詢兩個參數值都一樣,出現list結果為null 的情況。

這里先給出  mybatis 官方API的嵌套查詢多個參數傳值的說明文檔截圖

 

(嵌套查詢改造后的代碼如下)

<resultMap type="com.a.b.model.sku.SkuStock" id="ResultAllMap">
<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="cur_number" property="curNumber" jdbcType="DECIMAL"/> 
<id column="create_time" property="createTime" jdbcType="DATE"/>
<id column="update_time" property="updateTime" jdbcType="DATE"/>
<id column="del_flag" property="delFlag" jdbcType="INTEGER"/>

<!-- 這里的column 傳參s是傳給getBatchList 而getBatchList需要傳遞 兩個參數 參考官方API-->
<collection property="batchList" ofType="com.a.b.model.sku.SkuStockBatch"
select="getBatchList" column="{storeCode=store_code,skuCode=sku_code}">
</collection>

</resultMap>

<sql id="BathList_Column_List">
ssb.id, ssb.store_code, ssb.provider_code, ssb.sku_code,ssb.batch_number,
ssb.price, ssb.cur_number,ssb.tax_rate, ssb.price_cost,
ssb.del_flag
</sql>

<sql id="Base_Column_List">
id, store_code, sku_code, pro_status,cur_number, 
create_time, update_time, del_flag
</sql>

<select id="getBatchList" resultMap="BatchListResultMap">
SELECT <include refid="BathList_Column_List"/> FROM
sku_stock_batch ssb
where 1=1 and ssb.del_flag = 0
AND ssb.store_code = #{storeCode}
AND ssb.sku_code = #{skuCode}
</select>

<select id="findAll" resultMap="ResultAllMap">
SELECT <include refid="Base_Column_List"/> FROM sku_stock
where 1=1 and del_flag = 0
<if test="storeCode != null and storeCode !=''">
AND store_code = #{storeCode}
</if>
<if test="skuCode != null and skuCode!=''">
AND sku_code = #{skuCode}
</if>
order by create_time desc
</select>

改造后的代碼   

PageHelper分頁執行的統計就只有主表查詢的sql了

SELECT count(0)
 FROM sku_stock
 WHERE 1 = 1 AND del_flag = 0;

原文鏈接:https://blog.csdn.net/qq_35548458/article/details/96430288


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM