Primefaces Pagination而不将所有项加载到数组列表

时间:2014-08-27 22:38:10

标签: jsf primefaces

在JSF / JPA Web应用程序中,最终用户希望列出数千张账单。当使用普通数据表时,我使用一个分页助手,它为每个页面列出一系列账单,这样只有有限数量的账单被添加到ArrayList中。我更喜欢使用Primefaces数据表和自动分页以及几个很酷的选项。但问题是我必须将所有账单列入使用大量内存的ArrayList。有没有办法在PrimeFaces数据表中使用分页而不将所有Bills加载到ArrayList?

1 个答案:

答案 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进行测试。