BISOrderBy: mudanças entre as edições

De BIS Wiki
Ir para navegação Ir para pesquisar
Sem resumo de edição
mSem resumo de edição
 
(2 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
O BISOrderBy é o objeto usado em conjunto com os MOs pela camada de persistência do BISCore para definir a ordem que os objetos devem ser retornados ao utilizarmos os métodos de find. Para criar o BISOrderBy é possível de duas maneiras: instanciando o objeto como qualquer outro, ou utilizando os métodos estáticos "getBISOrderbyInstance()".
O BISOrderBy é o objeto usado em conjunto com os MOs pela [[BISDAO]] do BISFrameWork para definir a ordem que os objetos devem ser retornados ao utilizarmos os métodos de find. Para criar o BISOrderBy é possível de duas maneiras: instanciando o objeto como qualquer outro (sintaxe "new BISOrderBy(...)"), ou utilizando os métodos estáticos "getBISOrderbyInstance()". Em ambos os casos é possível passar dois atributos: coluna a ordenar e ascendência/descendência do campo. Por padrão, se passada só o nome da coluna, a ordem será ascendente. O nome da coluna a ser passada é o mesmo nome do atributo do VO.
Em ambos os casos é possível passar dois atributos: coluna a ordenar e ascendência / descendência do campo. Por padrão, se passada só o nome da coluna, a ordem será ascendente. O nome da coluna a ser passada é o mesmo nome do atributo do VO.


Por exemplo, se temos um ClientVO, e queremos ordenar pelo atributo "name", devemos criar o BISOrderBy passando a string "name" como parâmetro. Se desejarmos que a ordem da lista seja de Z para A, devemos passar o segundo atributo como "false". Como o valor padrão é sempre true na ordem da lista, não faz sentido passar o segundo atributo para obter uma lista ascendente.
 
Por exemplo, se temos um ClientVO, e queremos ordenar pelo atributo "name", devemos criar o BISOrderBy passando a String "name" como parâmetro. Se desejarmos que a ordem da lista seja de Z para A, devemos passar o segundo atributo como "false". Como o valor padrão é sempre true na ordem da lista, não faz sentido passar o segundo atributo para obter uma lista ascendente.
É possível organizar uma lista por um atributo que esteja em um sub VO. Por exemplo, imaginando que nosso ClientVO tenha um atributo "address" que carregue um AddressVO, e este tenha um atributo para o nome da rua chamado "street". Para ordenar a lista de clientes por nome da rua, devemos criar um BISOrderBy passando como atributo a string "address.street". Lembrando que o find a ser utilizado é de Client, e não de address.
É possível organizar uma lista por um atributo que esteja em um sub VO. Por exemplo, imaginando que nosso ClientVO tenha um atributo "address" que carregue um AddressVO, e este tenha um atributo para o nome da rua chamado "street". Para ordenar a lista de clientes por nome da rua, devemos criar um BISOrderBy passando como atributo a string "address.street". Lembrando que o find a ser utilizado é de Client, e não de address.




{{nota|Criando Constantes|Um dos possíveis problemas de se passar o nome do atributo como string é um futuro refactor ou alterações do código que venham a alterar o nome da coluna/atributo do VO. Quando isso ocorre, mesmo mudando os métodos Get e Set o nome do atributo passado na String não é validado pelo builder e gerará erro de RunTime já que o atributo não será encontrado no VO.
{{nota|Usando o MetaObjects|Um dos possíveis problemas de se passar o nome do atributo como String é um futuro refactor ou alterações do código que venham a alterar o nome da coluna/atributo do VO. Quando isso ocorre, mesmo mudando os métodos Get e Set o nome do atributo passado na String não é validado pelo builder e gerará erro de RunTime já que o atributo não será encontrado no VO.
Para evitar esse tipo de problema, recomendamos que os atributos usados comumente para ordenação da lista sejam colocados como constantes no MO. Desta forma ficam concentrados nas classes de VO as string de ordenação. Mesmo assim, nos casos de atributos em cadeia, como o nosso "address.street" não estará visível no objeto AddressMO, e sim no ClientMO.
 
Por isso a melhor maneira é evitar o refactor de nomes de atributos, e como evitar? Pensar bem antes de defini-los. Se não houver hipóteses e houver mesmo a necessidade de um refactor, lembre-se sempre de fazer pesquisar no código por texto com o nome do atributo.}}
Para evitar esse tipo de problema, recomendamos que os atributos passados no OrderBy sejam extraídos do MetaObject ([[BISVO_]]). Permitindo assim que futuras alterações sejam detectadas logo na compilação do sistema, não só durante o uso. Principalmente o uso já em homologação e pelo cliente.}}




Linha 17: Linha 17:
<syntaxhighlight lang="java5">
<syntaxhighlight lang="java5">
//Ordenando por uma coluna
//Ordenando por uma coluna
BISOrderBy.getBISOrderbyInstance(AbbreviationMO.ORDERBY_PRIORITY);
BISOrderBy.getBISOrderbyInstance(AbbreviationVO_.VO.priority());


//Ordenando por uma coluna de for descendente
//Ordenando por uma coluna de for descendente
BISOrderBy.getBISOrderbyInstance(AbbreviationMO.ORDERBY_PRIORITY, false);
BISOrderBy.getBISOrderbyInstance(AbbreviationVO_.VO.priority(), false);


//Ordenando por duas colunas
//Ordenando por duas colunas
BISOrderBy.getBISOrderbyInstance(AbbreviationMO.ORDERBY_PRIORITY, false).addOrderbyItem(AbbreviationMO.ORDERBY_OCCURENCE);
BISOrderBy.getBISOrderbyInstance(AbbreviationVO_.VO.priority(), false).addOrderbyItem(AbbreviationVO_.VO.occurrence());
</syntaxhighlight>}}
</syntaxhighlight>}}

Edição atual tal como às 17h26min de 7 de setembro de 2015

O BISOrderBy é o objeto usado em conjunto com os MOs pela BISDAO do BISFrameWork para definir a ordem que os objetos devem ser retornados ao utilizarmos os métodos de find. Para criar o BISOrderBy é possível de duas maneiras: instanciando o objeto como qualquer outro (sintaxe "new BISOrderBy(...)"), ou utilizando os métodos estáticos "getBISOrderbyInstance()". Em ambos os casos é possível passar dois atributos: coluna a ordenar e ascendência/descendência do campo. Por padrão, se passada só o nome da coluna, a ordem será ascendente. O nome da coluna a ser passada é o mesmo nome do atributo do VO.


Por exemplo, se temos um ClientVO, e queremos ordenar pelo atributo "name", devemos criar o BISOrderBy passando a String "name" como parâmetro. Se desejarmos que a ordem da lista seja de Z para A, devemos passar o segundo atributo como "false". Como o valor padrão é sempre true na ordem da lista, não faz sentido passar o segundo atributo para obter uma lista ascendente. É possível organizar uma lista por um atributo que esteja em um sub VO. Por exemplo, imaginando que nosso ClientVO tenha um atributo "address" que carregue um AddressVO, e este tenha um atributo para o nome da rua chamado "street". Para ordenar a lista de clientes por nome da rua, devemos criar um BISOrderBy passando como atributo a string "address.street". Lembrando que o find a ser utilizado é de Client, e não de address.


Usando o MetaObjects
Um dos possíveis problemas de se passar o nome do atributo como String é um futuro refactor ou alterações do código que venham a alterar o nome da coluna/atributo do VO. Quando isso ocorre, mesmo mudando os métodos Get e Set o nome do atributo passado na String não é validado pelo builder e gerará erro de RunTime já que o atributo não será encontrado no VO.

Para evitar esse tipo de problema, recomendamos que os atributos passados no OrderBy sejam extraídos do MetaObject (BISVO_). Permitindo assim que futuras alterações sejam detectadas logo na compilação do sistema, não só durante o uso. Principalmente o uso já em homologação e pelo cliente.


Para ordenar por múltiplas colunas, basta chamar os métodos "addOrderbyItem()" e passar os mesmos atributos citados acima, ou um BISOrderBy completo. A ordem em que estes são acrescentados define a prioridade de cada coluna, ou seja, a segunda coluna só será utilizada se houver empate na primeira, a terceira só será usada de houver empate na primeira e segunda, e assim por diante.


Criando BISOrderBy
//Ordenando por uma coluna
BISOrderBy.getBISOrderbyInstance(AbbreviationVO_.VO.priority());

//Ordenando por uma coluna de for descendente
BISOrderBy.getBISOrderbyInstance(AbbreviationVO_.VO.priority(), false);

//Ordenando por duas colunas
BISOrderBy.getBISOrderbyInstance(AbbreviationVO_.VO.priority(), false).addOrderbyItem(AbbreviationVO_.VO.occurrence());