mybaits中使用pageHelper 進行一對都分頁時結果不對的處理方式
阿新 • • 發佈:2019-02-10
1.pageHelper遇到resultMap的collection後,分頁總數不對
<resultMap id="orders" type="OrderDto"> <id property="id" column="id"/> <result property="number" column="onumber"/> <association property="address" javaType="AddressDto"> <id property="id" column="aid"/> <result property="name" column="aname"/> <result property="address" column="address"/> <result property="remark" column="aremark"/> </association> <association property="activity" javaType="ActivityDto"> <id property="id" column="cid"/> <result property="name" column="cname"/> </association> <collection property="productRels" ofType="OrderProductRelDto"> <id property="id" column="rid"/> <result property="qty" column="qty"/> </collection> </resultMap>
由於PageHelper分頁總數是根據count(0)來計算出來的(即自動生成一條SQL select count(0) from xx where 篩選條件),而collection會把結果集合並(一對多的情況),計算總數在合併結果集之前,所以計算的總數不對
2.pageHelper遇到resultMap的collection後,分頁結果集不對
同計數的原理一樣,分頁實際是在合併結果集之前進行的(即直接在查詢SQL語句後面加了limit x,x),這就導致了存在一對多情況時,實際返回的結果集個數與分頁要求的每頁結果集個數不一致,且如果最後一條記錄也涉及一對多時,結果集內容也不一定準確
綜上:需要使用pageHelper分頁時,resultMap不要用巢狀結果的方式,可以使用巢狀查詢的方式;
(巢狀查詢示例如下)
<resultMap id="BaseRoleResultMap" type="cn.com.hellowood.springsecurity.model.RoleModel"> <id column="id" property="id" jdbcType="INTEGER"/> <result column="name" property="name" jdbcType="VARCHAR"/> <result column="is_active" property="isActive" jdbcType="BOOLEAN"/> <result column="description" property="description" jdbcType="VARCHAR"/> <result column="last_update_time" property="lastUpdateTime" jdbcType="TIMESTAMP"/> <collection property="menus" ofType="cn.com.hellowood.springsecurity.model.menus" javaType="java.util.ArrayList" select="getMenus" column="id"> </collection> </resultMap>
參考自: