Quando utiliza-se lazy, para tratar a paginação sob demanda, todos filtros das colunas funcionam, no entanto o de categoria (combobox - genero) não. Pesquisei e procurei alguma forma e não consegui faze-lo funcionar.
Código do trecho da página:
<h:form id="formTabelaLivros">
<p:dataTable value="#{livroBean.livroDataModel}" widgetVar="tabelaLivros" var="livro" id="tabelaLivros" paginator="true" rows="5" lazy="true">
<f:facet name="header">Livros</f:facet>
<!-- este não funciona -->
<p:column headerText="Gênero" sortBy="#{livro.genero}" filterBy="#{livro.genero}" filterMatchMode="startsWith">
<f:facet name="filter">
<p:selectOneMenu onchange="PF('tabelaLivros').filter()">
<f:selectItem itemLabel="Selecione..." itemValue="#{null}" noSelectionOption="true" />
<f:selectItems value="#{livroBean.generos}" />
</p:selectOneMenu>
</f:facet>
<h:outputText value="#{livro.genero}" />
</p:column>
<p:column headerText="Titulo" sortBy="#{livro.titulo}" filterBy="#{livro.titulo}" filterMatchMode="startsWith">
<h:outputText value="#{livro.titulo}" />
</p:column>
<p:column headerText="ISBN" sortBy="#{livro.isbn}" filterBy="#{livro.isbn}" filterMatchMode="contains">
<h:outputText value="#{livro.isbn}" />
</p:column>
<p:column headerText="Preço" sortBy="#{livro.preco}" filterBy="#{livro.preco}" filterFunction="#{livroBean.precoEhMenor}">
<h:outputText value="#{livro.preco}">
<f:convertNumber type="currency" pattern="R$ #0.00"
currencySymbol="R$" locale="pt_BR" />
</h:outputText>
</p:column>
<p:column headerText="Data" sortBy="#{livro.dataLancamento.time}" filterBy="#{livro.isbn}" filterMatchMode="contains">
<h:outputText value="#{livro.dataLancamento.time}">
<f:convertDateTime pattern="dd/MM/yyyy HH:mm"
timeZone="America/Sao_Paulo" />
</h:outputText>
</p:column>
<p:column headerText="Remover">
<h:commandLink value="Remover" action="#{livroBean.remover(livro)}" />
</p:column>
<p:column headerText="Alterar">
<h:commandLink value="Alterar"
action="#{livroBean.carregar(livro)}" />
</p:column>
</p:dataTable>
</h:form>