Customizando propriedade sortBy do primefaces

O Primefaces disponibiliza a propriedade sortBy em alguns de seus componentes(p:column, p:dataTable) para fazer ordenação dos dados, essa propriedade espera um atributo do objeto declarado na propriedade var, por exemplo: sortBy=”#{categoria.descricao}”.

Por padrão a ordenação utiliza os critérios de desc e asc de acordo com a configuração ou seleção do usuário, no entanto podemos nos deparar com a necessidade de alterar a forma de ordenação na apresentação dos dados, como por exemplo quando formos fazer um relatório de categorias por total e precisamos apresentar categoria na ordem Y, X, Z, não seguindo uma ordem de ordenação padrão de crescente ou decrescente.

Para isso o Primefaces já tem uma solução, customizar a forma de ordenação que será aplicada no atributo sortBy, isso é possível usando o atributo sortFunction, que permite a criação de um método no código java para definir os critérios de ordenação.

Exemplo

categorias.xhtml
[code language=”Java”]
<p:dataTable var=”categoria” value=”#{categoriaController.categorias}” 
 sortBy=”#{categoria.descricao}” sortFunction=”#{categoriaController.customDescricaoSort}”>
 <p:column headerText=”Descrição” >
 <h:outputText value=”#{categoria.descricao}”/>
 </p:column>
 <p:column headerText=”Total” >
 <h:outputText value=”#{categoria.total}”/>
 </p:column>
</p:dataTable>
[/code]

  • sortBy: Propriedade recebe um atributo do objeto declaro no var;
  • sortFunction: Recebe um método que tem como retorno um int, semelhante ao compareTo.

CategoriaController.java
[code language=”Java”]

private static final Map<String, Integer > ORDEM_DESCRICAO = ImmutableMap.of(“Categoria Y”, 0, “Categoria X”, 1, “Categoria Z”, 2);

public int customDescricaoSort(Object val1, Object val2) {
 final String descricao1 = (String) val1;
 final String descricao2 = (String) val2;
 return ORDEM_DESCRICAO.get(descricao1).compareTo(ORDEM_DESCRICAO.get(descricao2));
}
[/code]

  • (String) val1: O casting é de acordo com o tipo do atributo referenciando na propriedade sortBy;
  • customDescricaoSort(Object val1, Object val2): É a mesma idéia do método compareTo, o método recebe dois Objects para que seja possível implementar os critérios de ordenação.