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>
Czy możesz podać pełny działający kod leniuchowania ładowania – spt