1. 程式人生 > 其它 >mybatis中Oracle分頁動態sql查詢中使用ORDER BY遇到的問題

mybatis中Oracle分頁動態sql查詢中使用ORDER BY遇到的問題

今天寫一個列表頁查詢功能

mybatis程式碼如下

<select id="getRolePage" resultType="cn.security.Role">
        SELECT
        *
        FROM
        (
            SELECT
            TMP.*,
            ROWNUM ROW_ID
            FROM
            (
                SELECT
                  t1.*,
                  t2.ORG_NAME
                FROM
                    T_ROLE t1
                    LEFT JOIN T_ORG_INFO t2 ON t1.PROJECT_ID = t2.ID
                WHERE
                    t1.EFFICIENT = 1
                    <if test="params.LIKE_roleName != null and params.LIKE_roleName != ''">
                        AND ROLE_NAME LIKE CONCAT(CONCAT('%',#{params.LIKE_roleName}),'%')
                    </if>
                    <if test="params.LIKE_roleKey != null and params.LIKE_roleKey != ''">
                        AND ROLE_KEY LIKE CONCAT(CONCAT('%',#{params.LIKE_roleKey}),'%')
                    </if>
                AND t2.EFFICIENT = 1
                ORDER BY TMP.ROLE_SORT DESC
            ) TMP
            WHERE
            ROWNUM <![CDATA[ <= ]]>  #{params.endNum}
        )
        WHERE
            ROW_ID <![CDATA[ > ]]> #{params.startNum}
    </select>               

 表中有12條資料,分頁查詢10條,發現專案執行結果和直接執行SQL結果存在兩條資料不一致。

原因:

ORDER BY 語句問題造成

解決方案:

把 ORDER BY語句移動到 ROWNUM 之後 
<select id="getRolePage" resultType="cn.security.Role">
        SELECT
        *
        FROM
        (
            SELECT
            TMP.*,
            ROWNUM ROW_ID
            FROM
            (
                SELECT
                  t1.
*, t2.ORG_NAME FROM T_ROLE t1 LEFT JOIN T_ORG_INFO t2 ON t1.PROJECT_ID = t2.ID WHERE t1.EFFICIENT = 1 <if test="params.LIKE_roleName != null and params.LIKE_roleName != ''"> AND ROLE_NAME LIKE CONCAT(CONCAT(
'%',#{params.LIKE_roleName}),'%') </if> <if test="params.LIKE_roleKey != null and params.LIKE_roleKey != ''"> AND ROLE_KEY LIKE CONCAT(CONCAT('%',#{params.LIKE_roleKey}),'%') </if> AND t2.EFFICIENT = 1 ) TMP WHERE ROWNUM <![CDATA[ <= ]]> #{params.endNum}        ORDER BY TMP.ROLE_SORT DESC ) WHERE ROW_ID <![CDATA[ > ]]> #{params.startNum} </select>