Java 在oracle SQL中正确排序分页结果
我有一个datatables服务器端分页的实现。查询生成器如下所示:Java 在oracle SQL中正确排序分页结果,java,sql,oracle,oracle10g,Java,Sql,Oracle,Oracle10g,我有一个datatables服务器端分页的实现。查询生成器如下所示: public static String buildPaginatedQueryForOracle(String baseQuery, PaginationCriteria paginationCriteria) { StringBuilder sb = new StringBuilder( "SELECT * FROM (SELECT FILTERED_ORDERED_RES
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行的页面,它将只在其中排序,尽管我还有其他页面。我能做些什么?您真的在使用多年不支持的Oracle 10g吗?这是否回答了您的问题?不,这是我自己的问题,我只是尝试了另一种形式的查询。。。现在是的,但我可以升级我希望需要和老板确认我能做什么?您可以首先为我们提供一个示例,包括表的DDL语句、一些示例数据的DML语句以及预期输出的详细信息。你说你想通过CNT订购,但你没有真正解释你期望的是什么,或者你的查询哪里出了问题。请提供足够的详细信息,以便我们了解您的需求,包括向我们显示输入数据、预期输出和错误。