Primefaces 筛选时加载Datatable扩展内容

Primefaces 筛选时加载Datatable扩展内容,primefaces,jsf-2.2,Primefaces,Jsf 2.2,我有一个使用rowExpansion的嵌套数据表。展开行时,将正确加载每个嵌套表的内容。但是,当筛选器应用于根表时,将加载所有嵌套表的内容。如果有很多行,这会降低性能 请注意,这不是“JSF多次调用getter”问题。扩展行的内容缓存在备份中。它的行为就像在应用过滤器之前展开每一行一样。请注意,筛选器只涉及“value”属性,而不涉及作为扩展内容的“strings” <p:dataTable value="#{backing.elements}" var="row" filteredV

我有一个使用rowExpansion的嵌套数据表。展开行时,将正确加载每个嵌套表的内容。但是,当筛选器应用于根表时,将加载所有嵌套表的内容。如果有很多行,这会降低性能

请注意,这不是“JSF多次调用getter”问题。扩展行的内容缓存在备份中。它的行为就像在应用过滤器之前展开每一行一样。请注意,筛选器只涉及“value”属性,而不涉及作为扩展内容的“strings”

<p:dataTable value="#{backing.elements}" var="row"
  filteredValue="#{backing.elementsFiltered}">

  <p:column>
    <p:rowToggler />
  </p:column>
  <p:column headerText="Value" filterBy="#{row.value}">
    <h:outputText value="#{row.value}" />
  </p:column>

  <p:rowExpansion>
    <p:dataTable value="#{row.strings}" var="string">
      <p:column headerText="Strings">
        <h:outputText value="#{string}" />
      </p:column>
    </p:dataTable>
  </p:rowExpansion>
</p:dataTable>

  
    
  
  
    
  
  
    
      
        
      
    
  
支持bean:

@Named
@ViewScoped
public class Backing implements Serializable {

    private List<Element> elements;
    private List<Element> elementsFiltered;

    @PostConstruct
    public void init() {
        // Load the list of elements.
    }

    public List<Element> getElements() {
        return elements;
    }

    public List<Element> getElementsFiltered() {
        return elementsFiltered;
    }

    public void setElementsFiltered(List<Element> elementsFiltered) {
        this.elementsFiltered = elementsFiltered;
    }
}
@Named
@视域
公共类支持实现可序列化{
私有列表元素;
过滤的私有列表元素;
@施工后
公共void init(){
//加载元素列表。
    }
公共列表getElements(){
返回元素;
    }
公共列表getElementsFiltered(){
返回元素过滤;
    }
public void setElementsFiltered(List elementsFiltered){
this.elementsFiltered=elementsFiltered;
    }
}
实体:

public class Element {

    private String value;
    private List<String> strings;

    public String getValue() {
        return value;
    }

    // This getter is called for a particular row when it is expanded.
    // But it is called for all rows when the table is filtered.
    public List<String> getStrings() {
        if (strings == null) {
            // Expensive opperation to load the strings.
        }
        return strings;
    }
}
公共类元素{
私有字符串值;
私有列表字符串;
公共字符串getValue(){
返回值;
    }
//展开特定行时,将为该行调用此getter。
//但在筛选表时,会对所有行调用它。
公共列表getStrings(){
if(strings==null){
//加载字符串的操作非常昂贵。
        }
返回字符串;
    }
}
这是虫子吗?还是我做错了什么


Primefaces 5.3.0、JSF2.2、JavaEE7.0

那么这在数据表的排序、分页或初始加载时不会发生?然后延迟加载行扩展内容?排序和初始加载时不会发生这种情况。但是,分页时确实会发生这种情况,但仅限于当前页面上的元素。是的,它很懒。我尽可能地简化了示例,但严格来说,扩展内容是通过JPA使用@OneToMany(fetch=FetchType.LAZY)加载的。就这个“问题”而言,您可以尝试6.0-SNAPSHOT吗?是的,我会尝试snapshotOff主题(有点):就个人而言,我总是使用懒散加载(以及相关的过滤等)。