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.
One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.