<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pt-BR">
	<id>https://wiki.rodrigogml.eng.br/index.php?action=history&amp;feed=atom&amp;title=RFWMO</id>
	<title>RFWMO - Histórico de revisão</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.rodrigogml.eng.br/index.php?action=history&amp;feed=atom&amp;title=RFWMO"/>
	<link rel="alternate" type="text/html" href="https://wiki.rodrigogml.eng.br/index.php?title=RFWMO&amp;action=history"/>
	<updated>2026-05-06T13:31:07Z</updated>
	<subtitle>Histórico de revisões para esta página neste wiki</subtitle>
	<generator>MediaWiki 1.37.0</generator>
	<entry>
		<id>https://wiki.rodrigogml.eng.br/index.php?title=RFWMO&amp;diff=65&amp;oldid=prev</id>
		<title>Rodrigogml: Criou página com &#039;O RFWMO é um MatchObject, isto é, ele carrega informações para descobrir objetos equivalentes. Em outras palavras ele permite um filtro de objetos baseados em seus atributos. Seu principal uso é feito pelo RFWDAO para a consulta de objetos persistidos.  De acordo com o nome do atributo criado no VO, o RFWDAO será capaz de retornar os objetos desejados sem mais linhas de código além do nome do atributo e seus métodos GET e SET.  Por exemplo, imaginando qu...&#039;</title>
		<link rel="alternate" type="text/html" href="https://wiki.rodrigogml.eng.br/index.php?title=RFWMO&amp;diff=65&amp;oldid=prev"/>
		<updated>2023-07-11T18:46:54Z</updated>

		<summary type="html">&lt;p&gt;Criou página com &amp;#039;O RFWMO é um MatchObject, isto é, ele carrega informações para descobrir objetos equivalentes. Em outras palavras ele permite um filtro de objetos baseados em seus atributos. Seu principal uso é feito pelo &lt;a href=&quot;/index.php?title=RFWDAO&quot; title=&quot;RFWDAO&quot;&gt;RFWDAO&lt;/a&gt; para a consulta de objetos persistidos.  De acordo com o nome do atributo criado no VO, o &lt;a href=&quot;/index.php?title=RFWDAO&quot; title=&quot;RFWDAO&quot;&gt;RFWDAO&lt;/a&gt; será capaz de retornar os objetos desejados sem mais linhas de código além do nome do atributo e seus métodos GET e SET.  Por exemplo, imaginando qu...&amp;#039;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Página nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;O RFWMO é um MatchObject, isto é, ele carrega informações para descobrir objetos equivalentes. Em outras palavras ele permite um filtro de objetos baseados em seus atributos. Seu principal uso é feito pelo [[RFWDAO]] para a consulta de objetos persistidos.&lt;br /&gt;
&lt;br /&gt;
De acordo com o nome do atributo criado no VO, o [[RFWDAO]] será capaz de retornar os objetos desejados sem mais linhas de código além do nome do atributo e seus métodos GET e SET.&lt;br /&gt;
&lt;br /&gt;
Por exemplo, imaginando que tenhamos os objetos ContactVO para representar um contato. E que um dos atributos presente no VO seja uma String &amp;quot;name&amp;quot;. Para buscar os VOs pelo conteúdo do seu atributo &amp;quot;name&amp;quot; exatamente, devemos criar uma instância do RFWMO e definir que queremos que &amp;quot;name&amp;quot; seja igual ao valor desejado:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{java|Exemplo Criação RFWMO para filtrar pelo valor do atributo &amp;quot;name&amp;quot;|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
RFWMO mo = new RFWMO();&lt;br /&gt;
mo.equals(ContractVO_.VO.name(), &amp;quot;João de Barros&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A lista de comandos aceitos estão no tópico abaixo, e podem ser verificadas de forma mais atualizada no próprio JavaDoc dos métodos do RFWMO.&lt;br /&gt;
&lt;br /&gt;
{{stop|Utilização do MetaObject [[RFWVO_]]|Para efeitos de compatibilidade e qualidade do sistema não passe uma String diretamente. Utilize o pattern do MetaObject [[RFWVO_]] para definir os atributos no RFWMO.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= VOs em Cadeia =&lt;br /&gt;
&lt;br /&gt;
O MO pode fazer buscas com filtros baseado nas informações próprias e de outros VOs que estejam dentro deles. Por exemplo, imagine o objeto ContactVO novamente. Imagine que dentro dele temos um atributo chamado &amp;quot;address&amp;quot; que é um AddressVO. E que por sua vez tem um atributo chamado &amp;quot;city&amp;quot; que é do tipo CityVO e dentro deste VO o nome da cidade é salva no atributo &amp;quot;name&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Agora, queremos obter todos os ContactVO cujo nome comecem com &amp;quot;Rodrigo&amp;quot;, e que a cidade seja igual a &amp;quot;Campinas&amp;quot;. Para realizar a busca com essas duas condições precisamos passar no MO os dois atributos:&lt;br /&gt;
&lt;br /&gt;
{{java|Exemplo Criação RFWMO para filtrar pelo valor do atributo &amp;quot;name&amp;quot;|&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
RFWMO mo = new RFWMO();&lt;br /&gt;
mo.like(ContractVO_.VO.name(), &amp;quot;Rodrigo%&amp;quot;);&lt;br /&gt;
mo.equals(ContractVO_.VO.cityvo().name(), &amp;quot;Campinas&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
Combinando ambas as condições no mesmo MO e usando qualquer um dos métodos de busca da camada de persistência devemos obter os objetos que satisfazem ambas as condições.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Lista de Comandos do MO =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{nota|Atributos definidos como null|Qualquer atributo definido como NULL é desconsiderado para o filtro de comparação no [[RFWDAO]]. Para buscar objetos que tenham algum atributo nulo ou não nulo, utilize respectivamente os comandos isNull e isNotNull de acordo com o desejado.}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center; width:100%;&amp;quot;&lt;br /&gt;
!colspan=&amp;quot;3&amp;quot;|Comandos do MO&lt;br /&gt;
|-&lt;br /&gt;
! Comando&lt;br /&gt;
! Classe do Parametro&lt;br /&gt;
! Detalhes&lt;br /&gt;
|-&lt;br /&gt;
|equal&lt;br /&gt;
|&amp;lt;Mesmo do VO&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Utiliza o modo de comparação equals do java ou o = do banco de dados. Faz com que um objeto tenha de ser exatamente igual à outro.&lt;br /&gt;
|-&lt;br /&gt;
|notEqual&lt;br /&gt;
|&amp;lt;Mesmo do VO&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Inversão do modo de comparação equals. Faz com que o objeto tenha que ser diferente do definido.&lt;br /&gt;
|-&lt;br /&gt;
|greaterThanOrEqualTo&lt;br /&gt;
|&amp;lt;Mesmo do VO&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Compara dois valores numéricos. Faz com que o valor dos VOs retornados sejam maiores ou iguais ao o valor definido no MO.&lt;br /&gt;
|-&lt;br /&gt;
|greaterThan&lt;br /&gt;
|&amp;lt;Mesmo do VO&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Compara dois valores numéricos. Faz com que o valor dos VOs retornados sejam maiores que os valor definido no MO.&lt;br /&gt;
|-&lt;br /&gt;
|lessThanOrEqualTo&lt;br /&gt;
|&amp;lt;Mesmo do VO&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Compara dois valores numéricos. Faz com que o valor dos VOs retornados sejam menores ou iguais ao o valor definido no MO.&lt;br /&gt;
|-&lt;br /&gt;
|lessThan&lt;br /&gt;
|&amp;lt;Mesmo do VO&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Compara dois valores numéricos. Faz com que o valor dos VOs retornados sejam menores que os valor definido no MO.&lt;br /&gt;
|-&lt;br /&gt;
|isNull&lt;br /&gt;
|&amp;lt;Nenhum&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Se definido retorna os objetos cujo atributo esteja nulo.&lt;br /&gt;
|-&lt;br /&gt;
|isNotNull&lt;br /&gt;
|&amp;lt;Nenhum&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Se definido retorna os objetos cujo atributo &amp;#039;&amp;#039;&amp;#039;não&amp;#039;&amp;#039;&amp;#039; esteja nulo.&lt;br /&gt;
|-&lt;br /&gt;
|like&lt;br /&gt;
|String&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Este comando é semelhante ao &amp;#039;like&amp;quot; do banco de dados. Busca os atributos que se encaixam em um determinado padrão. Utiliza as mesmas mascaras do MySQL: % para indicar uma cadeia qualquer de caracteres, e _ para indicar um único carácter qualquer. Só funciona para conteúdos do tipo String.&lt;br /&gt;
|-&lt;br /&gt;
|in&lt;br /&gt;
|Collection&amp;lt;&amp;lt;Mesmo do VO&amp;gt;&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Recebe uma lista de objetos da mesma classe que o atributo do VO. Retorna o VO se o valor do VO estiver na lista passada, ou seja, se o valor for igual a qualquer um dos itens da lista.&lt;br /&gt;
|-&lt;br /&gt;
|notIn&lt;br /&gt;
|Collection&amp;lt;&amp;lt;Mesmo do VO&amp;gt;&amp;gt;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Recebe uma lista de objetos da mesma classe que o atributo do VO. Retorna o VO se o valor do VO NÃO estiver na lista passada, ou seja, se o valor for diferente de todos os itens da lista.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Lógica Booleana entre Operações =&lt;br /&gt;
&lt;br /&gt;
Por ser a mais usada, quando mais de uma condição é definida no MO a operação booleana de concatenação entre as condições padrão é o AND. Mas isso não é fixo e pode ser alterado! Caso queira que trocar o AND por OR utilize o método:&amp;lt;pre&amp;gt;setAppendmethod(APPENDMETHOD appendmethod)&amp;lt;/pre&amp;gt; e passe o atributo:&amp;lt;pre&amp;gt;APPENDMETHOD.OR&amp;lt;/pre&amp;gt;.&lt;br /&gt;
Além de alterar a condição de AND para OR, algumas vezes é necessário combinar ambas. Pra combinar diversas condições mesclando os operadores AND e OR. Como cada MO só permite trabalhar com o AND ou OR por vez, temos que montar os conjuntos em MOs separados e depois junta-los. Por exemplo, imaginemos que temos diversas condições: c1, c2, ..., cN. E queremos o resultado da expressão:&lt;br /&gt;
&amp;lt;pre&amp;gt;((c1 AND c2 AND c3) OR c4) AND ((c5 OR c6) AND c7)&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Para este caso temos que montar as expressões em MOs separadas de acordo com os operadores lógicos usados:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;MO1:&amp;#039;&amp;#039;&amp;#039; Usando o Appendmethod = AND, definimos as condições c1, c2 e c3; [MO1 representa &amp;quot;(c1 AND c2 AND c3)&amp;quot;]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;MO2:&amp;#039;&amp;#039;&amp;#039; Usando o Appendmethod = OR, definimos a condição c4, e colocamos o &amp;#039;&amp;#039;&amp;#039;MO1&amp;#039;&amp;#039;&amp;#039; na lista de submos usando o método:&amp;lt;pre&amp;gt;setSubmo(List&amp;lt;RFWMO&amp;gt; submo)&amp;lt;/pre&amp;gt; [MO2 representa &amp;quot;(MO1 OR c4)&amp;quot;]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;MO3:&amp;#039;&amp;#039;&amp;#039; Usando o Appendmethod = OR, definimos o c5 e c6; [MO3 representa &amp;quot;(c5 OR c6)&amp;quot;]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;MO4:&amp;#039;&amp;#039;&amp;#039; Usando o Appendmethod = AND definimos o c7 e assim como fizemos antes, colocamos o &amp;#039;&amp;#039;&amp;#039;MO3&amp;#039;&amp;#039;&amp;#039; como submo deste MO; [MO4 representa &amp;quot;(MO3 AND c7)&amp;quot;]&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;MO5:&amp;#039;&amp;#039;&amp;#039; Por fim, usando o Appendmethod = AND, não definimos nenhuma condição adicional, mas temos que definir os &amp;#039;&amp;#039;&amp;#039;MO2&amp;#039;&amp;#039;&amp;#039; e o &amp;#039;&amp;#039;&amp;#039;MO4&amp;#039;&amp;#039;&amp;#039; como submos deste MO; [MO5 representa &amp;quot;(MO2 AND MO4)&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
== Otimizando a Consulta ==&lt;br /&gt;
&lt;br /&gt;
Assim como no SQL, utilizando as operações booleanas para otimizar e simplificar as operações. Embora não tenhamos ainda todas as ferramentas necessárias na estrutura do MO (como por exemplo usar o NOT em um submo), algumas operações podemos realizar tranquilamente. Se analisarmos novamente a expressão anterior, podemos usar 1 objeto a menos se tirarmos os paréntesis e deixamos a expressão assim:&lt;br /&gt;
&amp;lt;pre&amp;gt;((c1 AND c2 AND c3) OR c4) AND (c5 OR c6) AND c7&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Desta maneira montaríamos os MOs da seguinte maneira:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;MO1, MO2 e MO3&amp;#039;&amp;#039;&amp;#039; permaneceriam os mesmos;&lt;br /&gt;
* No &amp;#039;&amp;#039;&amp;#039;MO4&amp;#039;&amp;#039;&amp;#039; definiríamos c7 normalmente, mas pasaríamos &amp;#039;&amp;#039;&amp;#039;MO3&amp;#039;&amp;#039;&amp;#039; e &amp;#039;&amp;#039;&amp;#039;MO2&amp;#039;&amp;#039;&amp;#039; como submos;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;MO5&amp;#039;&amp;#039;&amp;#039; não é mais necessário.&lt;br /&gt;
&lt;br /&gt;
Outras lógicas podem ser aplicadas como por exemplo. Analisando a expressão acima no seguinte trecho:&lt;br /&gt;
&amp;lt;pre&amp;gt;c5 OR c6&amp;lt;/pre&amp;gt;&lt;br /&gt;
e supormos que c5 e c6 sejam condições do tipo &amp;#039;&amp;#039;&amp;#039;equal&amp;#039;&amp;#039;&amp;#039;. A regra de lógica booleana diz que se negarmos os operandos e invertermos o operador booleano teremos a mesma tabela verdade:&lt;br /&gt;
&amp;lt;pre&amp;gt;A OR B = !A AND !B&amp;lt;/pre&amp;gt;&lt;br /&gt;
assim, se c5 e c6 são condições do tipo &amp;#039;&amp;#039;&amp;#039;equal&amp;#039;&amp;#039;&amp;#039; sua negação é a operação &amp;#039;&amp;#039;&amp;#039;not equal&amp;#039;&amp;#039;&amp;#039;, disponível no MO, vamos chama-las de nc5 e nc6, assim a expressão ficaria assim:&lt;br /&gt;
&amp;lt;pre&amp;gt;nc5 AND nc6&amp;lt;/pre&amp;gt;&lt;br /&gt;
o que deixa a nossa expressão completa da seguinte forma:&lt;br /&gt;
&amp;lt;pre&amp;gt;((c1 AND c2 AND c3) OR c4) AND (nc5 AND nc6) AND c7&amp;lt;/pre&amp;gt;&lt;br /&gt;
observe que os parênteses em volta de nc5 e nc6 são desnecessários agora. E dessa forma podemos eliminar outro objeto (o anterior &amp;#039;&amp;#039;&amp;#039;MO3&amp;#039;&amp;#039;&amp;#039;), bastando para isso definir as condições c5 e c6 negadas (nc5 e nc6) diretamente no que chamamos de &amp;#039;&amp;#039;&amp;#039;MO4&amp;#039;&amp;#039;&amp;#039;. Usando a mesma lógica, e supondo quais seriam as condições, seriamos capaz de inverter as lógicas e remover todos os parênteses deixando apenas 1 operando, seja ele AND seja ele OR.&lt;/div&gt;</summary>
		<author><name>Rodrigogml</name></author>
	</entry>
</feed>