在JSF / JPA Web应用程序中,最终用户希望列出数千张账单。当使用普通数据表时,我使用一个分页助手,它为每个页面列出一系列账单,这样只有有限数量的账单被添加到ArrayList中。我更喜欢使用Primefaces数据表和自动分页以及几个很酷的选项。但问题是我必须将所有账单列入使用大量内存的ArrayList。有没有办法在PrimeFaces数据表中使用分页而不将所有Bills加载到ArrayList?
答案 0 :(得分:1)
是的,您可以使用延迟加载数据模型。
有关如何执行此操作的详细解释in this article。
基本上你需要做的就是为这样的方法编写代码
public Collection<T> getAll(
int first,
int pageSize,
String sortField,
SortOrder sortOrder,
Map<String, String> filters)
所有分页都在数据库中完成,因此您只需在UI中检索适合您页面的记录。
本文介绍了使用它所需的一切。
本文中过时的一件事是,当您想要按其值过滤dataTable时,如何处理数值。例如,您必须自己处理转换(这可以在“过滤器”部分中找到)
if (pathType.equals(Long.class)){
try{
filterCondition = cb.and(filterCondition, cb.equal(pathFilterNonString, Long.valueOf(filter.getValue())));
}catch(java.lang.NumberFormatException nfe){
//ignore
//java.lang.NumberFormatException: For input string: "a"
}
}else if (pathType.equals(Integer.class)){
try{
filterCondition = cb.and(filterCondition, cb.equal(pathFilterNonString, Integer.valueOf(filter.getValue())));
}catch(java.lang.NumberFormatException nfe){
//ignore
//java.lang.NumberFormatException: For input string: "a"
}
}else if (pathType.equals(Timestamp.class)){
try{
filterCondition = cb.and(filterCondition, cb.equal(pathFilterNonString, Timestamp.valueOf(filter.getValue())));
}catch(java.lang.IllegalArgumentException e){
//ignore
//java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
}
}
我一直在项目中使用这个分页器一年,使用PrimeFaces 4.还没有使用PrimeFaces 5进行测试。