Primefaces 数据表不适用于过滤器 + 排序

Primefaces datatable doesn't work with filter + sort

我正在使用 primefaces 数据表来显示大约 1000 行(和 7 列)。它工作得很快,但是当我过滤一个列并尝试按不同的列对数据集进行排序时,我会出现奇怪的行为。 这是一个示例:在第一张图片中,加载时有数据表,看起来很棒。它受到严格审查,因为我正在处理敏感数据。在第二张图片中,我过滤了 2 列,数据表在此之前工作正常,但如果我在那之后对第三列进行排序,我将停止工作,不会显示正确的行。那里显示的值("não determinado" 和很多白色区域)在我的数据中不存在。

这是我的代码:

<p:dataTable var="prot" value="#{myBean.listaProtocolos}" rows="15" 
 sortBy="#{prot.dataEntradaArea}" sortFunction="#{myBean.sortXMLDatas}" 
 sortOrder="descending" paginator="true" style="font-size: 0.9em;" 
 paginatorPosition="bottom">
  <p:column filterBy="${prot.nrProtocolo}" filterMatchMode="contains" 
   width="8%" style="text-align:center">
    <f:facet name="header">ID</f:facet>
    <p:commandLink action="#{myBean.verDetalhesProtocolo}">
      <h:outputText value="#{prot.nrProtocolo}" 
       style="text-decoration: underline;"/>
      <f:setPropertyActionListener target="#{myBean.nrProtocolo}"
       value="#{prot.nrProtocolo}" />
    </p:commandLink>
  </p:column>
  <p:column filterBy="${prot.nrProcesso}" filterMatchMode="contains"
   width="10%">
    <f:facet name="header">Número</f:facet>
    <h:outputText value="#{prot.nrProcesso}" />
  </p:column>
  <p:column filterBy="${prot.tipoDeProtocoloDescricao}" 
   filterOptions="#{myBean.filtrosTipoDeProtocoloDescricao}" 
   width="10%">
    <f:facet name="header">Processo / Protocolo</f:facet>
    <h:outputText value="#{prot.tipoDeProtocoloDescricao}" />
  </p:column>
  <p:column filterBy="${prot.assunto}" sortBy="#{prot.assunto}"
   filterMatchMode="contains" width="30%">
    <f:facet name="header">Assunto</f:facet>
    <h:outputText value="#{prot.assunto}" />
  </p:column>
  <p:column filterBy="${prot.areaAtual}" sortBy="#{prot.areaAtual}"
   filterMatchMode="contains" width="15%">
    <f:facet name="header">Área Atual</f:facet>
    <h:outputText value="#{prot.areaAtual}" />
  </p:column>
  <p:column filterBy="${prot.tipo}" sortBy="#{prot.tipo}"
   filterMatchMode="contains" width="17%">
    <f:facet name="header">Tipo</f:facet>
    <h:outputText value="#{prot.tipo}" />
  </p:column>
  <p:column filterBy="${prot.dataEntradaAreaFormatada}" 
   sortBy="#{prot.dataEntradaArea}" sortFunction="#{myBean.sortXMLDatas}"
   filterMatchMode="contains" width="10%" style="text-align:center">
    <f:facet name="header">Data de Entrada</f:facet>
    <h:outputText value="#{prot.dataEntradaAreaFormatada}" />
  </p:column>
</p:dataTable>

我正在使用 primefaces v6.0。 myBean 是@SessionScoped。

为什么会发生这种行为?

我去年也遇到过类似的问题。我设法做了一个解决方法(我对此不太满意)来使用 filterFunction=#{mbean.filter} 并制作我自己的过滤器函数。

我注意到您在 p:datatable 标签中遗漏了一个重要的值,即 filteredValue="",它是另一个类似于 value="" 的列表,其中包含过滤后的值。

filteredValue="#{myBean.filteredListaProtocolos}"