Verificar strings separadas dentro de num parametro

14 respostas
F

Pessoal, nao sei se é possivel, mas estou tentando desenvolver a seguinte situacao:

A pessoa digita uma frase no campo de busca, por exemplo: automovel preto

A busca tem que me retornar também os resultados: golf automovel preto, golf preto, automovel preto 2010

minha busca consiste nos codigos abaixo:

Entrada da consulta

<input  type="text" name="localizaprod" size="30" />

Onde pego o parametro

..
              
            String localiz = request.getParameter("localizaprod");
            if (localiz != null) {
                request.setAttribute("localizaprod", "%" + localiz + "%");
                request.setAttribute("localiz", localiz);
..

Voces tem alguma dica disso?

grato

14 Respostas

gallo

Para quebrar a String em seus espaços em branco você pode usar o split. Essa busca que você fala é uma consulta SQL? Explica melhor o que você pretende fazer.

jamirdeajr

Uma sugestão seria quebrar as palavras usando Split e então montar tua condição de busca dinamicamente,
Se for via SQL fazer usar LIKE e OR: Ex. txt like ‘%automovel%’ or txt like ‘%preto%’,
Se for Hibernate poderá fazer um Criteria

String[] palavras = localiz.split(" "); for(String palavra : palavras) { if(palavra.trim().length() > 0) { ... incluir cada palavra no LIKE no SQL com OR ... ou montar o Criteria Hibernate dinamicamente } }

F

Entao, os valores que vem no parametro eu monto a query automatico(sql)

gallo

Se você fizer da forma que o jamirdeajr acredito que você chegue onde precisa.

F

blz pessoal,

incrementei no codigo que eu preciso, rolou sem erros.

No entanto, ele me retorna consulta normal(se eu colocar palavras unicas), se colocar frases sem ser exata, ele nao acha nada

Quando voce diz, usar o OR ou LIKE, eu consigo fazer comparacao tipo

v.veiculo like ?

agora, nao entendi como comparar strings diretas(como no exemplo voce colocou os textos propriamente) :

like '%automovel%' or txt like '%preto%'

ou seja transformar isso em codigo

gallo

um exemplo:

select campo_texto from tabela where campo_texto like '%automovel%' or campo_texto like '%preto%'

A parte do where você precisa montar a partir do laço resultado do split das strings, conforme o código explicado pelo jamirdeajr.

Como está ficando sua consulta? Está dando algum erro?

F

gallo,

Aqui eu pego o parametro:

String localiz = request.getParameter("localizaprod");  
            if (localiz != null) {  
   request.setAttribute("localizaprod", "%" + localiz + "%");  
request.setAttribute("localiz", localiz);

Aqui é onde a query é montada:

// ** Começo da query
  StringBuffer query = new StringBuffer();
            query.append("SELECT p.cod_material, p.descricao, p.preco, p.preco_tfabrica, p.tem_icone, if(p.item_tfabrica = 'S' && p.preco_tfabrica > 0,'p','n') as temEstoque, ").append("p.item_tfabrica, p.id_emontadora, f.fmodelo as fmodelo, ").append("IF(preco_tfabrica > 0,IF(preco > preco_tfabrica,preco_tfabrica,preco),preco) as preco_ordem ");
			...
			...
			
 queryGeral.append("FROM pesquisafilial p, fmodelo_pesquisafilial fp, fmodelo f, emontadora e, armv a, pesquisafilial_armv pa ").append(" WHERE ").append("pa.id_armv = a.id_armv AND ").append("p.cod_material = pa.cod_material AND ").append("f.fmodelo = fp.fmodelo AND ").append("p.cod_material = fp.cod_material AND ").append("e.id_emontadora = p.id_emontadora AND ").append("(a.nome like ? OR p.descricao like ? OR e.descricao like ?) ");
 ..
gallo

Oh, mais ou menos isso (é um exemplo, pode ser melhorado bastante)

// ** Começo da query  
  StringBuffer query = new StringBuffer();  
            query.append("SELECT p.cod_material, p.descricao, p.preco, p.preco_tfabrica, p.tem_icone, if(p.item_tfabrica = 'S' && p.preco_tfabrica &gt; 0,'p','n') as temEstoque, ").append("p.item_tfabrica, p.id_emontadora, f.fmodelo as fmodelo, ").append("IF(preco_tfabrica &gt; 0,IF(preco &gt; preco_tfabrica,preco_tfabrica,preco),preco) as preco_ordem ");  
            ...  
            ...  
              
queryGeral.append("FROM pesquisafilial p, fmodelo_pesquisafilial fp, fmodelo f, emontadora e, armv a, pesquisafilial_armv pa ").append(" WHERE ").append("pa.id_armv = a.id_armv AND ").append("p.cod_material = pa.cod_material AND ").append("f.fmodelo = fp.fmodelo AND ").append("p.cod_material = fp.cod_material AND ").append("e.id_emontadora = p.id_emontadora AND ").append("a.nome like ? and (";


String[] palavras = localiz.split(" ");  
for(String palavra : palavras) {  
   if(palavra.trim().length() &gt; 0) {  
			queryGeral.append("p.descricao like ? OR ");  
   }  
}  

// Apaga o último OR
queryGeral.delete(queryGeral.length() - 3, queryGeral.length());

// Fechar Parênteses
queryGeral.append(")");

Pelo que vi você usa PreparedStatement pra fazer sua consulta, então na hora de enviar os parâmetros você terá que adicionar também o String[] palavras.
Vê ai se ajuda.

F

Blz gallo…acertei o codigo dos parametros, e modifiquei o codigo com algumas outras coisas…

agora o final da query abaixo que vc mencionou:

").append("a.nome like ? and (";

ele nao esta aceitando de forma alguma fechar os parenteses aqui:

// Fechar Parênteses  
queryGeral.append(")");
gallo

Não está aceitando, mas ele dá algum erro?

F

na linha da query que mencionei, da o erro

')' expected
gallo

Mas esse erro é na execução da query ou no fonte java? Manda o erro completo e manda o fonte na forma que ficou.

F

O codigo deixei assim, o erro esta acusando é ‘)’ expected na linha onde deixei marcada.

Alterei o o jeito como fechava. mas nao adiantou.

queryGeral.append("FROM pesquisafilial p, fmodelo_pesquisafilial fp, fmodelo f, emontadora e, armv a, pesquisafilial_armv pa ").append(" WHERE ").append("pa.id_armv = a.id_armv AND ").append("p.cod_material = pa.cod_material AND ").append("f.fmodelo = fp.fmodelo AND ").append("p.cod_material = fp.cod_material AND ").append("e.id_emontadora = p.id_emontadora AND ").append("a.nome like ? and (";   <--aqui acusa erro no fonte
  
  
String[] palavras = localiz.split(" ");    
for(String palavra : palavras) {    
   if(palavra.trim().length() > 0) {    
            queryGeral.append("p.descricao like ? OR ");    
   }    
}    
  

queryGeral.delete(queryGeral.length() - 3, queryGeral.length());  
  

queryGeral.append(")");
gallo

fecha o parênteses antes do ponto-e-virgula.

queryGeral.append("FROM pesquisafilial p, fmodelo_pesquisafilial fp, fmodelo f, emontadora e, armv a, pesquisafilial_armv pa ").append(" WHERE ").append("pa.id_armv = a.id_armv AND ").append("p.cod_material = pa.cod_material AND ").append("f.fmodelo = fp.fmodelo AND ").append("p.cod_material = fp.cod_material AND ").append("e.id_emontadora = p.id_emontadora AND ").append("a.nome like ? and (");   &lt;--aqui
Criado 26 de abril de 2011
Ultima resposta 26 de abr. de 2011
Respostas 14
Participantes 3