2012-04-13 20 views
7

Birisi zaten sorduysa ve belki de aptalca bir soru sorduğunda bu soruyu sorduğum için özür dilerim ama bu konuda yeniyim ve uzmansınız ve uzman tavsiyenizden öğrenmeyi çok isterim. deneyim.Sayılarla ve sonraki sayfalarla Jp sayfalama, önceki

Sayfa başına 200 kayıt görüntüleyen bir uygulamaya disk belleği eklemek istiyorum. Sayfanın alt kısmında sayı olmalıdır. 1050 varsa, ilk sayfa 100 görüntülenir ve sayfanın alt kısmı sayıları 1,2,3,4,5

Bunu gerçekleştirecek genel mantık nedir? Veritabanının her seferinde 200 seçmesi gerektiğini biliyorum ve ilk kaydı takip etmeliyim.

  1. Sayfanın alt kısmında görüntülenecek sayı sayısını bilmek için toplam kaç kayıt döndürüleceğini bilmenin bir yolu var mı? Bir count() ifadesinin veya başka bir şeyin seçilmesini gerektirir mi?
  2. 1050 kayıtlar için, 1,2,3,4,5 & 6 numaralarının her biri görüntülenecek ve tıklanarak sunucuya bir çağrı yapılmalıdır. Sunucuya yapılan sonraki çağrıda kaç kaydın iade edileceğini bilmenin bir yolu var mı? Bir count() ifadesinin veya başka bir şeyin seçilmesini gerektirir mi?
+0

Soruyu cevaplamak için zaman ayırdığınız için herkese teşekkürler. Kodumu güncelleyeceğim ve bununla ilgili başka sorularım olup olmadığını size bildireceğim. – javafun

cevap

6

Bunu yapmak için JPA Criteria API kullanabilirsiniz. TypedQuery varsayarsak, veritabanından döndürülen kayıtları sınırlamak için setFirstResult ve setLastResult kullanırsınız. Tabii ki, bu yöntemlerin değerleri, hangi sayfanın talep edildiğine ve sayfa başına kaç kayıt kaydedildiğine bağlı olacaktır.

first = (page - 1) * page size; 
last = (page * size) - 1; 

Not: Bu (sıfır aksine) ilk sayfa 1 varsayar.

Kayıt sayımı almak için standart bir Kriterler sorgusu gerçekleştirirsiniz. Örnek:

final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); 
final CriteriaQuery<Long> countQuery = builder.createQuery(Long.class); 
countQuery.select(builder.count(countQuery.from(MyEntity.class))); 
final Long count = entityManager.createQuery(countQuery) 
     .getSingleResult(); 

Yukarıdaki kodu, başka bir sorguya göre saymak için özelleştirebilirsiniz. Son olarak, toplam sayımı müşteriye geri iletmenin bir yoluna ihtiyacınız vardır. Bunu yapmanın bir yolu, sorgunuzun sonuç kümesini sayım için bir öznitelik içeren başka bir nesnede sarmalamak veya DAO çağrınızın sonucu olarak söz konusu nesneyi döndürmektir. Veya alternatif olarak, count niteliğini istek kapsamınızdaki bir nesnede saklayabilirsiniz.

public class ResultListWrapper<T> { 
    private Long count; 
    private Collection<T> results; 

    // constructor, getters, setters 
} 
+0

Teşekkür ederim! – javafun

0

Evet, satırları kendileri almadan önce bir seçim yapmak zorundasınız.

2

Genellikle kaç tane sayfa bulunduğunu bulmak için gerçek sorguyu çalıştırmadan önce sütunlar yerine select list komutunu kullanmak dışında aynı sorguyu gerçekleştirirsiniz. hazırda belirli bir sayfa sonra böyle bir şeyle yapılabilir Başlarken:

ekstra sorgu gerçekleştiren bir operasyon o zaman sadece bir sonraki/önceki bağlantı sağlamak veya gerektiğinde alternatif olarak ekstra sayfaları sağlayarak düşünebiliriz çok pahalı ise
int maxRecords = // page size ... 
int startRow = // page number * page size 
Query query = session.createQuery('...'); 
query.setMaxResults(maxRecords); 
query.setFirstResult(startRow); 

(örn Yüklenen verilerin sonuncusu ajax yoluyla göründü.

Sayfa numarası bağlantıları gösterme de dahil olmak üzere sayfalanmış sonuçları görüntülemek için (bu verileri görüntülemek için jsp sayfalarını kullandığınızı varsayarak) display tag JSP etiket kitaplığını kullanmanızı öneririm. Ekran etiketi, JSP'ye alabileceğinizi varsayarak, tablo verilerini ve sıralama verilerini sıralar.

+0

Yardımlarınız için teşekkürler! – javafun

0

Spring Data JPA'a bakın. Temelde Algı'nın daha önce nasıl önerildiğini, sadece bunu yapmak zorunda olmadığınızı, çerçevenin sizin için yaptığını gösteriyor. Varsayılan olarak sayfalama ve sıralama alırsınız (Query DSL'u kullanmak istemiyorsanız yine de filtreleme yapmanız gerekir).

Ana sayfada, hızlı bir tanıtım gösteren 1 saatlik bir video var, ancak kimliğin ne olduğu konusunda fikir edinmek için yalnızca 15 dakika boyunca izlemeye ihtiyacınız olacak.