2012-11-16 35 views
7

Tôi đang cố gắng để thực hiện tải chậm trong thiết lập datfaces datatable của tôi. Hiện tại, tính năng này đang hoạt động mà không cần triển khai tải chậm, nhưng tôi không nhận được dữ liệu trong dữ liệu sau khi triển khai tải chậm. Tuy nhiên, tôi có thể in danh sách của mình trong phương thức LoadData để xác minh rằng dữ liệu đang được tải vào danh sách của tôi, nhưng dường như có vấn đề khi LazyModel của tôi được trả về và quá trình tải dữ liệu được cố gắng. Điều này có thể chỉ là một cái gì đó đơn giản mà tôi nhìn ra. Bất kỳ trợ giúp nào cũng được đánh giá rất cao!Primefaces Lazy Loading không có dữ liệu trong datatable

Đây là mã lớp ScreenshotListProducer tôi:

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

Đây là lớp Ảnh chụp màn hình của tôi:

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

Đây là mã xhtml của tôi:

<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

bạn có thể cung cấp mã làm việc đầy đủ về tải lộng lẫy – spt

Trả lời

10

Vâng trong trường hợp lười biếng bộ nạp bạn sẽ phải đặt tổng số bản ghi của bạn như "this.setRowCount (total_records_that_are_there);" trong phương thức "tải" của bạn. Nó là cần thiết cho bộ tải lười để xác định bao nhiêu trang sẽ có để các nút tiếp theo và trước đó trên bảng dữ liệu có thể được xác định tức là (Bật/tắt). Giống như [0 là bắt đầu] và [total/rowsize] là tổng số trang mà bạn tìm nạp bằng cách sử dụng phương thức tải với (first và pagezie => skip và limit);

+0

Cảm ơn thông tin. Cách đây chưa đầy một tuần, tôi đã cố định phân loại bằng cách đặt số lượng hàng và kích thước trang của mình, nhưng tôi đã đi vào các vòng kết nối cố gắng làm cho bộ lọc của tôi hoạt động bình thường. Nó hiện đang trả về hai bản ghi đầu tiên lặp đi lặp lại, nhưng nó có số hàng và các hàng cơ sở dữ liệu chính xác trên mỗi trang. Bất kỳ đề xuất? – user1530469

+0

Vấn đề lọc của tôi với các bản ghi lặp lại là do một sự tham gia cơ sở dữ liệu đang diễn ra do cách tôi đang lọc. – user1530469

+0

Cảm ơn! Ghi đè getRowCount chính xác là những gì tôi cần! –

Các vấn đề liên quan