[Resolvido!] Consulta com criteria utilizando dois nomes distintos de um mesmo campo

9 respostas
Kleber-rr

Olá Pessoal, boa tarde.

Estou precisando criar uma espécie de concatenação na minha criteria de nome, tipo a do google.

Por exemplo: o campo nome possui o nome completo do indivíduo, tipo: João da Silva Sauro;

A minha critéria utiliza o matchmode.anyware, que permite procurar por qualquer nome dentro do campo, não precisando ser completo.

O que eu quero fazer, é que o usuário possa pesquisar tipo assim: joao + sauro (observe que os dois nomes estão no mesmo campo, mas separados por outra palavra…)

Alguma sugestão?

Abs.

9 Respostas

drsmachado

Pode haver uma maneira mais adequada, porém, eu apenas substituiria o espaço entre as palavras por “%” e mandaria uma única String para o criteria buscar.

Kleber-rr

Exato, porém gostaria de substituir o “%” pelo “+”, já que este é mais familiar para o usuário.

Muito obrigado pela dica.

drsmachado

Exato, porém gostaria de substituir o “%” pelo “+”, já que este é mais familiar para o usuário.

Muito obrigado pela dica.
É que o coringa das consultas SQL é o %. Então, mandando um “%”, a princípio, o Criteria deverá retornar qualquer nome que possua “João” no começo e termine com “Sauro”.

Portanto, o usuário pode digitar “João Sauro” com espaço entre as palavras, aí, cabe à tua lógica, trocar (replace?) o espaço pelo %.

Kleber-rr
drsmachado:
Kleber-rr:
drsmachado:
Pode haver uma maneira mais adequada, porém, eu apenas substituiria o espaço entre as palavras por "%" e mandaria uma única String para o criteria buscar.

Exato, porém gostaria de substituir o "%" pelo "+", já que este é mais familiar para o usuário.

Muito obrigado pela dica.


É que o coringa das consultas SQL é o %. Então, mandando um "%", a princípio, o Criteria deverá retornar qualquer nome que possua "João" no começo e termine com "Sauro".

Portanto, o usuário pode digitar "João Sauro" com espaço entre as palavras, aí, cabe à tua lógica, trocar (replace?) o espaço pelo %.

Então drsmachado, obrigado pelas dicas.

Estou tentando fazer isto que vc me disse, dentro do meu método list no bean. Só que ele me retorna um erro NullpointerException na linha do name.replaceAll("\\ ", "%");. POde-se verificar a expressão abaixo:
public List<Funcionario> getFuncionariosGenerico() {

		Session session = HibernateUtil.currentSession();
		FuncionarioDao funcionarioDao = new FuncionarioDao(session,
				Funcionario.class);
		String name =  this.getFuncionario().getNome();
		if (name != ""
				|| this.getFuncionario().getCpf() != ""
				|| this.getFuncionario().getRg() != "") {
			name.replaceAll("\\ ", "%");
			List<Funcionario> lista = funcionarioDao.pesquisaFuncionarios(name,
					this.getFuncionario().getCpf(), this.getFuncionario()
							.getRg());
			return lista;
		} else {

			return null;
		}
	}
A exception:
Caused by: java.lang.NullPointerException
	at br.gov.rr.setrabes.handler.ConsultasHandler.getFuncionariosGenerico(ConsultasHandler.java:88)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at javax.el.BeanELResolver.getValue(BeanELResolver.java:62)
	at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
	at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:64)
	at org.apache.el.parser.AstValue.getValue(AstValue.java:118)
	at org.apache.el.parser.AstEmpty.getValue(AstEmpty.java:45)
	at org.apache.el.parser.AstNot.getValue(AstNot.java:42)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71)
	... 45 more
Ele disse que o name.replaceAll é nulo... Acho que ele quer fazer a substituição antes de ser preenchido o campo... tentei fazer esta implementação no DAO, e dá erro tb...
Caused by: java.lang.NullPointerException
	at br.gov.rr.setrabes.dao.FuncionarioDao.pesquisaFuncionarios(FuncionarioDao.java:126)
	at br.gov.rr.setrabes.handler.ConsultasHandler.getFuncionariosGenerico(ConsultasHandler.java:86)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at javax.el.BeanELResolver.getValue(BeanELResolver.java:62)
	at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
	at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:64)
	at org.apache.el.parser.AstValue.getValue(AstValue.java:118)
	at org.apache.el.parser.AstEmpty.getValue(AstEmpty.java:45)
	at org.apache.el.parser.AstNot.getValue(AstNot.java:42)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71)
	... 45 more
O método no DAO:
@SuppressWarnings("unchecked")
	public List<Funcionario> pesquisaFuncionarios(String nome, String cpf,
			String rg) {
		Criteria c = session.createCriteria(Funcionario.class);
		String name =  nome;
		name.replaceAll("\\ ", "%");
		List<Funcionario> results = new ArrayList<Funcionario>();
		c.add(Restrictions.ilike("nome", name, MatchMode.ANYWHERE));
		c.add(Restrictions.like("cpf", cpf, MatchMode.ANYWHERE));
		c.add(Restrictions.like("rg", rg, MatchMode.ANYWHERE));
		c.addOrder(Order.asc("nome"));
		results = (List<Funcionario>) c.list();
		return results;
	}

Eae pessoal, alguma luz???

Vlw.

drsmachado

Você não precisa do \, somente

nome = nome.replace(" ", "%");

deve funcionar.

Pois toda String é imutável, então, você estará criando uma nova referência.

Kleber-rr

drsmachado:
Você não precisa do \, somente

nome.replace(" ", "%");

deve funcionar.

pior que não… :frowning:

drsmachado

Bom, consegue debuggar?
Tenho quase certeza que nome está nulo, logo, irá lançar esse erro.

Kleber-rr
drsmachado:
Bom, consegue debuggar? Tenho quase certeza que nome está nulo, logo, irá lançar esse erro.

Bom dia drsmachado, td bem?

Ele estava nulo sim, pois o parâmetro ainda não havia sido preenchido, então eu tratei da seguinte forma:
if (name == null) {
			name = "";
		}
		
		if (name != "") {
			name = name.replaceAll(" ", "%");

E aqui deu certo.

Obrigado pela ajuda.

drsmachado
Kleber-rr:
drsmachado:
Bom, consegue debuggar? Tenho quase certeza que nome está nulo, logo, irá lançar esse erro.

Bom dia drsmachado, td bem?

Ele estava nulo sim, pois o parâmetro ainda não havia sido preenchido, então eu tratei da seguinte forma:
if (name == null) {
			name = "";
		}
		
		if (name != "") {
			name = name.replaceAll(" ", "%");

E aqui deu certo.

Obrigado pela ajuda.


Maravilha.
Como eu havia dito, o % é o coringa.

Se está resolvido, edita o original e coloca [resolvido] no título

Criado 27 de junho de 2011
Ultima resposta 1 de jul. de 2011
Respostas 9
Participantes 2