java - 在 oracle SQL 中正确排序分页结果
问题描述
我有一个数据表服务器端分页的实现。查询生成器如下所示:
public static String buildPaginatedQueryForOracle(String baseQuery, PaginationCriteria paginationCriteria) {
StringBuilder sb = new StringBuilder(
"SELECT * FROM (SELECT FILTERED_ORDERED_RESULTS.*, COUNT(1) OVER() total_records, ROWNUM AS RN FROM (SELECT BASEINFO.* FROM ( #BASE_QUERY# ) BASEINFO ) FILTERED_ORDERED_RESULTS #WHERE_CLAUSE# #ORDER_CLASUE# ) WHERE RN > (#PAGE_NUMBER# * #PAGE_SIZE#) AND RN <= (#PAGE_NUMBER# + 1) * #PAGE_SIZE# ");
String finalQuery = null;
int pageNo = paginationCriteria.getPageNumber() / paginationCriteria.getPageSize();
paginationCriteria.setPageNumber(pageNo);
if (!AppUtil.isObjectEmpty(paginationCriteria)) {
finalQuery = sb.toString().replaceAll("#BASE_QUERY#", baseQuery)
.replaceAll("#WHERE_CLAUSE#",
((AppUtil.isObjectEmpty(paginationCriteria.getFilterByClause())) ? "" : " WHERE ")
+ paginationCriteria.getFilterByClause())
.replaceAll("#ORDER_CLASUE#", paginationCriteria.getOrderByClause())
.replaceAll("#PAGE_NUMBER#", paginationCriteria.getPageNumber().toString())
.replaceAll("#PAGE_SIZE#", paginationCriteria.getPageSize().toString());
}
return (null == finalQuery) ? baseQuery : finalQuery;
}
其中 base_query 是来自 dao-impl 层的常用字符串。它做得很好。但是,当我想在 order 子句中按 cnt 对结果进行排序时(这种特殊情况使用 cnt 来计算链接到第一个表中每一行的另一个表的行,如下所示)
SELECT *
FROM (
SELECT FILTERED_ORDERED_RESULTS.*,
COUNT(1) OVER() TOTAL_RECORDS
FROM (
SELECT BASEINFO.*,
ROWNUM AS RN
FROM (
SELECT A.ID_LIST AS ID,
A.NAME,
A.DATE_CREATE AS DATECREATE,
A.DATE_UPDATE AS DATEUPDATE,
A.USER_ID AS USERID,
A.TYPE,
NVL(
B.CNT, 0
) CNT
FROM MAP_S_LIST_ARTS A
LEFT JOIN (
SELECT ID_LIST,
COUNT(*) CNT
FROM MAP_LIST_ARTS
GROUP BY ID_LIST
) B ON A.ID_LIST = B.ID_LIST
ORDER BY A.ID_LIST DESC
) BASEINFO
) FILTERED_ORDERED_RESULTS
ORDER BY CNT DESC
)
WHERE RN > (:PAGE * 5) AND RN <= (:PAGE + 1) * 5
我得到的是它首先在另一个排序中采用前 5 行(默认是按 id),然后仅将按 cnt 的排序应用于它们。例如,如果我获取一个有 5 行的页面,它只会在其中排序,尽管我还有其他页面。我能做些什么?
解决方案
推荐阅读
- perl - 尝试在 Centos-7 上安装 DBD-Pg-2.19.3 时找不到 version.pm
- linq - ef6 linq 方法为查询中的嵌套条目返回 $ref
- c# - “玩家”游戏对象没有附加“Rigidbody2D”,但脚本正在尝试访问它。(统一)
- javascript - 发出 axios 请求的组件被挂载两次以使异步测试通过,如果它在测试失败时被挂载。为什么
- c# - 如何修复 MetroMessageBox 标题大小显示问题
- android - 将数组列表作为参数传递并将其显示为列表
- python - 将列表的定义从迭代转换为理解
- powershell - 将结果传递给 PowerShell 中的类似过滤器
- html - 下拉菜单不查看其项目
- python - Matplotlib - 将线性回归线扩展到图形的整个宽度