2016-04-08 21 views
1

Bir Java-EE uygulamasında çalışıyorum ve bir anahtar sözcük aramasının sonucu olarak verileri bir html sayfasına filtreliyorum. Milyonlarca kayıt eşleşmesi olabilir, ancak hepsini bir defada ön tarafa getirmek istemiyorum. Ama aynı zamanda sayfalama yapmak için kayıt sayısını bilmem gerekiyor. Bunu çok fazla ağ trafiği yapmadan gerçekleştirmek için herhangi bir fikir? Veri tabanı Oracle SQL 11g'dir. Program struts 1.3 çerçevesini takip ediyor.Dizin Oluşturma ve Sayfalandırma

+0

servlet ve GSON ile Datatable uygulamak en iyi örnek buraya bakınız çalışıyor: http://stackoverflow.com/questions/23110665/limit-of-displaying- satırlar-in-datatables. –

cevap

1

bir cevap bulundu ve :)

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

Kesinlikle tüm sorgu sonucunu istemciye göndermemelisiniz. Eğer COUNT

  • seçilen kayıtları örn almak kullanabilirsiniz, sonuçların

    1. olsun numarasını: Sen 2 sorguları yapabilirsiniz u yapacağız controller içerisinde

      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 
      } 
      

      : - sayfa 1 kayıtlar 1'den 30.

  • +0

    Yanıtladığınız için teşekkürler. Sayıları kullanarak ve tüm kayıtları getirirken satır sayısı alınırken aynı zaman miktarı almıyor mu? – Bhugy

    0

    en iyi yol olarak ek parametreler örneğin & ucunu başlamak olduğunuz DAO'sunda bir yöntem oluşturmaktır Neredeyse aynıdır ve POST veya GET isteği ile başlangıç ​​ve bitiş parametreleri verecektir. }

    şimdi size jsp dosya üzerinde müşterilerin kaydın bir parçası olması ve bu sublisted sonucu :)

    0

    Kullanım ayrı sorgu satırları saymak almak için nasıl görüntüleneceğini karar vermek sana kalmış.

    iki farklı yaklaşımlar uygulayabilirsiniz sayfalama uygulamak için:

    1) kullanarak 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 getir-eğer sen istediği sonuç kümesinin son satıra ayarlanır: MIN_ROW_TO_FETCH almak için ayarlanmış sonucunun ilk satırda ayarlanır

    2) FETCH OFFSET kullanımı:

    select /*your_query_goes_here, with order by*/ fetch first :ROWS_PER_PAGE rows only 
    

    Bu, tablonun satırında belirtilen sıraya göre tablonun ilk N satırını (N = ROWS_PER_PAGE) gösterecektir.

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

    Bu (sıralanmış sırayla) tabloya ofset ve daha sonra tablo bir sonraki N satır almak olacaktır.

    +0

    Cevabınız için teşekkürler ... ofset getirme Oracle 11g'de çalışıyor mu? – Bhugy

    +0

    Emin değilim ... Ve şu anda kontrol edemedim. –

    0

    Herhangi bir sayfada eşleşen sonuçları almak ve bu sonuçların sayısını 1 okumak için okuyun.

    Şimdi, bir sayfa varsayılarak 10 öğe bulunacaktır.

    Sen Bu prosedür PROC_TEST çağrı ve sayma görevi gerçekleştirir

    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; 
    

    kullanarak beklediğiniz alabilir.