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
fabio_silveira
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
fabio_silveira
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%'ortxtlike'%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?
// ** Começo da queryStringBufferquery=newStringBuffer();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 StringBufferquery=newStringBuffer();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 ? and (";String[]palavras=localiz.split(" ");for(Stringpalavra:palavras){if(palavra.trim().length()>0){queryGeral.append("p.descricao like ? OR ");}}// Apaga o último ORqueryGeral.delete(queryGeral.length()-3,queryGeral.length());// Fechar ParêntesesqueryGeral.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
fabio_silveira
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
fabio_silveira
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
fabio_silveira
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 ("); <--aqui