mybatis中Oracle分頁動態sql查詢中使用ORDER BY遇到的問題
阿新 • • 發佈:2021-10-12
今天寫一個列表頁查詢功能
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>