2016-04-08 6 views
1

Я работаю над приложением Java-EE, и я фильтрую данные на html-страницу в качестве результатов поиска ключевых слов. Могут быть миллионы записей, но я не хочу сразу же выводить их всех на передний план. Но в то же время мне нужно знать количество записей для разбивки на страницы. Любые идеи для достижения этого без значительного сетевого трафика? База данных - Oracle SQL 11g. Программа соответствует рамкам struts 1.3.Индексирование и разбиение на страницы

+0

посмотреть здесь лучший пример реализации DataTable с сервлетов и gson: http://stackoverflow.com/questions/23110665/limit-of-displaying- строки-в-DataTables. –

ответ

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) 
0

Вы определенно не должны отправлять весь результат запроса клиенту. Вы можете сделать 2 запросы:

  1. получить число результатов, вы можете использовать COUNT
  2. получить выбранные записи, например, страница 1 - записи от 1 до 30.
+0

Спасибо, что ответили. Разве он не принимает одинаковое количество времени при получении количества строк с использованием count и при извлечении всех записей? – Bhugy

0

лучшего способа, чтобы создать метод в вашем DAO, которые, как дополнительные параметры запуск & конца, например:

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 
} 

в контроллере у сделают почти то же самое и u даст начальный и конечный параметры через запрос 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)); 

возвращение «ваш-вид»; }

теперь у вас есть часть записи клиентов на файл JSP и до вас, чтобы решить, как отобразить этот sublisted результат :)

0

Используйте отдельный запрос для получения подсчета строк.

Чтобы применить нумерацию страниц можно применить два различных подхода:

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 

Это отображает первые N строк таблицы (N = ROWS_PER_PAGE) в порядке, указанном в предложении order by.

select /*your_query_goes_here, with order by*/ offset (:PAGE_NUMBER - 1) * :ROWS_PER_PAGE fetch first :ROWS_PER_PAGE rows only 

Это будет смещено в таблицу (в отсортированном порядке), а затем выберет следующие N строк таблицы.

+0

Спасибо, что ответили .. это офсетная заправка работает в oracle 11g? – Bhugy

+0

Я не уверен ... И не мог проверить это прямо сейчас. –

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 выполняет задачу подкачки и подсчета голосов.

Смежные вопросы