[RESOLVIDO]usar like em vez do equal(=) comparação de string com % usando criteria

Olá estou começando com jpa pulei para o 2 nunca usei o hibernate.

Tive vários problemas
1º- Usar o LIKE em vez do = para usar o %. Objetivo é retrnar uma lista de pessoas usando ajax, a pessoa digita e a lista vai cendo criada.

		EntityManagerFactory emf = Persistence
				.createEntityManagerFactory("teste");

		EntityManager em = emf.createEntityManager();

		CriteriaBuilder qb = em.getCriteriaBuilder();

		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery<VbiCredenciado> criteria = qb.createQuery(tabela1.class);
		
		Root<tabela1> entity = criteria.from(tabela1.class);
		entity.fetch("tabela2"); //join mapiada na entidade

                criteria.where(cb.equal(entity.get("tabela2").get("colunaNome"), nomeQueQuero));
		criteria.orderBy(cb.asc(entity.get("tabela2").get("colunaNome")));
		Query query = em.createQuery(criteria);

está funcionando, retorna se estiver batendo os nomes e colocar nomeQueQuero+"%" não funciona. Testei no banco a query.

2º-quando o valor é nulo é provocado um erro por causa que na Entity essoa o campo nome está nullable = “false”, tirando resolve o problema.

O que quero é deixar o nullable.

E para completar os dados são buscados em uma view, então não preciso persistir os dados, alguma dica extra de quem quizer me dar :slight_smile: .

Não contatena o %, usa assim:

No matchmode vc escolhe como será feito o like.

No seu caso 2, se o campo é not null, e está vindo null para a busca, significa que o usuário não forneceu o valor para a busca, logo vc não adiciona o filtro para esse campo.

mario.fts, obrigado por responder

O problema é causado por outro problema como tem muita forma de fazer tanto jpa ou hibernate ou eclipselink, cada busca na internet é diferente.

O criteria.add nem aparece para min, mas aparece cb.like, mas dá erro, pois o padrão é (Expression<java.lang.String> x,Expression<java.lang.String> pattern) ou Expression<java.lang.String> x, java.lang.String pattern) ou Expression<java.lang.String> x,Expression<java.lang.String> pattern), char charscape) e mais alguns com variasões dos que coloquei.

Só para informar os imports que uso é são javax.persistence…*;

Cara não sei se fui claro, mais o Restrictions que aparece é do hibernate. se eu colocar cb do código acima tem que usar os padrões que informei.

Cara como fazer o like com metamodel?

ou alternativo tanto faz.

Bom reolve o problema do like usando nem sei o que é se é metamodel ou jpa api mesm, mas pesquisando encontrei um site que por bondade do cara não mostrou somente o codigo crebado, mas adicionou um exemplo que funcionou.O link http://blogs.sun.com/Lance/entry/generating_the_jpa_2_0

Tava me complicando com Expression e SingleAttribute da forma que fiz deu certo e retornou corretamente.

O codigo.

[code]

	EntityManagerFactory emf = Persistence.createEntityManagerFactory("portal");

	EntityManager em = emf.createEntityManager();
	
	CriteriaBuilder cb = em.getCriteriaBuilder();
	CriteriaQuery<String> cq = cb.createQuery(String.class);
	Root<Pessoa> cred = cq.from(VbiCredenciado.class);
	Join<Pessoa, PessoaJuridica> pj = cred.join(Pessoa_.pessoaJuridica);
	
	cq.select(pj.<String>get(PessoaJuridica_.nomeFantasia)).where(cb.like(pj.<String>get("nomeFantasia"),credQuery+"%"));
	
	TypedQuery<String> q= em.createQuery(cq);
            returnNomes = (List<String>) q.getResultList();
	[/code]