索引和分页

时间:2016-04-08 07:35:34

标签: java sql oracle indexing pagination

我正在研究Java-EE应用程序,并且我将数据过滤到html页面,这是关键字搜索的结果。可能有数百万条记录匹配,但我不想立刻将它们全部带到前端。但与此同时,我需要知道进行分页的记录数量。没有太多网络流量的任何想法来实现这一目标?数据库是Oracle SQL 11g。程序遵循struts 1.3框架。

5 个答案:

答案 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)

您绝对不应该将整个查询结果发送给客户端。你可以做两个查询:

  1. 获得结果数量,您可以使用COUNT
  2. 获取所选记录,例如第1页 - 1至30的记录。

答案 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完成分页和计数任务。

相关问题