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
<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>
- 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
... 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)); }
- (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.