我正在研究Java-EE应用程序,并且我将数据过滤到html页面,这是关键字搜索的结果。可能有数百万条记录匹配,但我不想立刻将它们全部带到前端。但与此同时,我需要知道进行分页的记录数量。没有太多网络流量的任何想法来实现这一目标?数据库是Oracle SQL 11g。程序遵循struts 1.3框架。
答案 0 :(得分:1)
使用单独的查询来获取行数。
要应用分页,您可以应用两种不同的方法:
1)使用ROWNUM:
select *
from ( select /*+ FIRST_ROWS(n) */
a.*, ROWNUM rnum
from ( /*your_query_goes_here,
with order by*/ ) a
where ROWNUM <= :MAX_ROW_TO_FETCH )
where rnum >= :MIN_ROW_TO_FETCH;
:MAX_ROW_TO_FETCH设置为结果集的最后一行,如果你想要的话 :MIN_ROW_TO_FETCH设置为要获取的结果集的第一行
2)使用OFFSET FETCH:
select /*your_query_goes_here, with order by*/ fetch first :ROWS_PER_PAGE rows only
这将按照order by子句中指定的顺序显示表的前N行(N = ROWS_PER_PAGE)。
select /*your_query_goes_here, with order by*/ offset (:PAGE_NUMBER - 1) * :ROWS_PER_PAGE fetch first :ROWS_PER_PAGE rows only
这将偏移到表中(按排序顺序),然后获取表的下N行。
答案 1 :(得分:1)
找到答案,它正在运作:)
SELECT * FROM
(
SELECT a.*, rownum r__
FROM
(
SELECT CATEGORY.*,rownum FROM CATEGORY
ORDER BY CATNAME ASC
) a
WHERE rownum < ((pageno * pagesize) + 1 )
)
WHERE r__ >= (((pageno-1) * pagesize) + 1)
答案 2 :(得分:0)
您绝对不应该将整个查询结果发送给客户端。你可以做两个查询:
COUNT
答案 3 :(得分:0)
最好的方法是在你的DAO中创建一个方法,该方法有额外的参数start&amp;结束例如:
getCustomers(String keyword, int start,int end){
// get all customers
// sublist the result and get the data from start index to end index
// Or U cane use a query using LIMIT
}
你的控制器中的你会做的几乎一样,你会通过POST或GET请求给出开始和结束参数
@RequestMapping(value = "/sublistedCustomers", method = RequestMethod.GET)
public String getSublistedCustomers(@RequestParam("end") final String keyword,@RequestParam("start") final int start,@RequestParam("end") final int end){
model.addAttribute("cutomersResult",yourDAO.getCustomers(keyword,start,end));
返回&#34;你的观点&#34 ;; }
现在您的jsp文件中有一部分客户记录,由您决定如何显示此子列表结果:)
答案 4 :(得分:0)
如果您想在任何页面中获得匹配结果,并且 1读取这些结果的计数。
现在,假设一个页面将包含10个项目。
您可以使用
获得您期望的结果CREATE OR REPLACE PROCEDURE PROC_TEST (V_PAGE_NUMBER IN NUMBER,
V_RESULTS OUT SYS_REFCURSOR,
V_RESULT_COUNT OUT NUMBER) IS
BEGIN
OPEN V_RESULTS FOR
SELECT T.*
FROM (SELECT T.*, ROWNUM ROWNUMBER
FROM DJ_NSRXX T
WHERE ROWNUM <= V_PAGE_NUMBER * 10) T
WHERE ROWNUMBER > 10 * (V_PAGE_NUMBER - 1);
SELECT COUNT(*) INTO V_RESULT_COUNT FROM DJ_NSRXX;
END;
此过程PROC_TEST完成分页和计数任务。