2012-11-16 7 views
7

Sto tentando di implementare il caricamento lazy all'interno della configurazione datatable del mio primefaces. Attualmente, questo funziona senza l'implementazione di caricamento lento, ma non ottengo dati nel datatable dopo aver implementato il caricamento lazy. Tuttavia, posso stampare la mia lista nel mio metodo LoadData per verificare che i dati vengano caricati nel mio elenco, ma sembra esserci un problema una volta che il mio LazyModel viene restituito e si tenta di caricare il datatable. Questo potrebbe essere solo qualcosa di semplice che sto trascurando. Qualsiasi aiuto è molto apprezzato!Primefaces Lazy Caricamento dati non disponibile

Ecco il mio codice della classe 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; 
    } 

Ecco la mia classe Screenshot:

@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; 
    } 
} 

Ecco il mio codice 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

è possibile fornire il codice completo di lavoro lazing caricamento – spt

risposta

10

Ebbene, nel caso di pigri loader dovrai impostare il numero totale di record come "this.setRowCount (total_records_that_are_there);" nel tuo metodo "carica". È necessario che il caricatore pigro determini quante pagine ci saranno in modo che i pulsanti successivi e precedenti sulla tabella dati possano essere determinati i (es. Abilita/disabilita). Come [0 è start] e [total/rowsize] è il numero totale di pagine che tuttavia si recuperano usando il metodo load con (first e pagezie => skip e limit);

+0

Grazie per le informazioni. Poco più di una settimana fa ho corretto il mio ordinamento impostando il conteggio delle righe e le dimensioni della pagina, ma ho cercato in cerchio di far funzionare correttamente il mio filtro. Attualmente sta restituendo i primi due record più e più volte, ma ha il numero corretto di righe e righe di database per pagina. Eventuali suggerimenti? – user1530469

+0

Il mio problema di filtro con i record ripetuti era dovuto a un join del database che stava accadendo a causa del modo in cui stavo facendo il mio filtro. – user1530469

+0

Grazie! Override di getRowCount è esattamente ciò di cui avevo bisogno! –