1. 程式人生 > >mybaits中使用pageHelper 進行一對都分頁時結果不對的處理方式

mybaits中使用pageHelper 進行一對都分頁時結果不對的處理方式

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>

參考自: