2012-11-16 21 views
7

Próbuję zaimplementować leniwy ładowanie w ramach moich ustawień pierwotnych datatable. Obecnie działa to bez leniwej implementacji ładowania, ale nie dostaję żadnych danych w datatable po wdrożeniu leniwego ładowania. Jednak mogę wydrukować listę w mojej metodzie LoadData, aby sprawdzić, czy dane są ładowane na moją listę, ale wydaje się, że jest problem, gdy mój LazyModel jest zwracany i próba załadowania danych. To może być po prostu coś prostego, co przeoczę. Każda pomoc jest bardzo cenna!Primefaces Lazy Ładowanie żadnych danych w datatable

Oto mój kod klasy ScreenshotListProducer:

@ManagedBean 
    @RequestScoped 
    public class ScreenshotListProducer implements Serializable { 
     private static final long serialVersionUID = 1L; 
     @Inject 
     private EntityManager em; 

     private List<Screenshot> screenshots; 

     private LazyDataModel<Screenshot> lazyModel = null; 

     private int pageSize = 5; 

     public void setPageSize(int pageSize) { 
      this.pageSize = pageSize; 
     } 

     public int getPageSize() { 
      return pageSize; 
     } 

     @Produces 
     @Named 
     public List<Screenshot> getScreenshots() { 
      System.out.println("************* getting screenshots list **************"); 
      return screenshots; 
     } 

     @PostConstruct 
     public void LoadData() { 
      lazyModel = new LazyDataModel<Screenshot>() { 
       private static final long serialVersionUID = 1L; 

        @Override 
        public List<Screenshot> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String,String> filters) {  
        int start = first; 
        int end = first + pageSize; 

        try { 
         CriteriaBuilder cb = em.getCriteriaBuilder(); 
         CriteriaQuery<Screenshot> criteria = cb.createQuery(Screenshot.class); 
         Root<Screenshot> screenshot = criteria.from(Screenshot.class); 
         criteria.select(screenshot).orderBy(cb.asc(screenshot.get("time"))); 

         TypedQuery<Screenshot> s = em.createQuery(criteria); 
         s.setMaxResults(end - start); 
         s.setFirstResult(start); 

         screenshots = s.getResultList(); 
         System.out.println("************* lazy screenshot list created **************"); 
         for (Screenshot lazylist : screenshots) { 
          System.out.println("id numbers in lazy list: " + lazylist.getId()); 
         } 
        } catch (NullPointerException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 

        return screenshots; 
        } 
      }; 
     } 

    public LazyDataModel<Screenshot> getLazyModel() { 
     return lazyModel; 
    } 

Oto moja klasa ekranu:

@Entity 
@XmlRootElement 
@Table(name="Test2012", uniqueConstraints = @UniqueConstraint(columnNames = "id")) 
public class Screenshot implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue 
    @Column(name = "id", columnDefinition="INT") 
    private Long id; 

    private Timestamp time; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    public Timestamp getTime() { 
     return time; 
    } 

    public void setTime(Timestamp time) { 
     this.time = time; 
    } 
} 

Oto mój kod xhtml:

<p:dataTable id="table1" var="scrshot" rowKey="#{scrshot.id}" value="#{screenshotListProducer.lazyModel}" paginator="true" rows="7" paginatorPosition="bottom" 
       paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
       rowsPerPageTemplate="7,20,50,100" widgetVar="dataTable" currentPageReportTemplate="(Number of Records: {totalRecords})" 
       emptyMessage="No screenshot data found with given criteria" lazy="true" scrollable="true" draggableColumns="true" scrollHeight="217" style="width: 100%;"> 
      <f:facet name="header"> 
      <p:outputPanel> 
       <h:outputText value="Search all fields: "/> 
       <p:inputText id="globalFilter" onkeyup="dataTable.filter()"/> 
      </p:outputPanel> 
      </f:facet> 
      <p:column selectionMode="multiple"/> 
      <p:column id="time" headerText="Time" sortBy="#{scrshot.time}" filterBy="#{scrshot.time}" filterMatchMode="startsWith"> 
      <h:outputText value="#{scrshot.time}"/> 
      </p:column> 
      <p:column id="id" headerText="ID" sortBy="#{scrshot.id}" filterBy="#{scrshot.id}" filterOptions="#{scrshot.id}" filterMatchMode="exact"> 
      <h:outputText value="#{scrshot.id}"/> 
      </p:column> 
    </p:dataTable> 
+0

Czy możesz podać pełny działający kod leniuchowania ładowania – spt

Odpowiedz

10

Również w przypadku leniwy loader będziesz musiał ustawić całkowitą liczbę twoich rekordów jak "this.setRowCount (total_records_that_are_there);" w twojej metodzie "obciążenia". Dla leniwego programu ładującego konieczne jest określenie, ile stron będzie stron, aby można było ustalić następny i poprzedni przycisk na tabeli danych, tj. (Włącz/wyłącz). Podobnie jak [0 is start] a [total/rowsize] jest całkowitą liczbą stron, jednak pobierasz używając metody load (first i pagezie => skip i limit);

+0

Dzięki za informacje. Trochę ponad tydzień temu naprawiłem sortowanie, ustawiając liczbę wierszy i rozmiar strony, ale robiłem kółka, próbując sprawić, by moje filtrowanie działało prawidłowo. Obecnie zwraca dwa pierwsze rekordy w kółko, ale ma odpowiednią liczbę wierszy i wierszy bazy danych na stronę. Jakieś sugestie? – user1530469

+0

Mój problem z filtrowaniem z powtarzającymi się rekordami wynikał z dołączenia do bazy danych, które miało miejsce z powodu sposobu, w jaki robiłem filtrowanie. – user1530469

+0

Dzięki! Przesłanianie getRowCount jest dokładnie tym, czego potrzebowałem! –

Powiązane problemy