Criteria JPA AutoComplete [Resolvido]

Ola Pessoal,

Eu estou estudando JPA e agora em Criteria estou tendo dificuldades. Gostaria de cria um filtro que busca no banco as informações que o usuário digitou é um auto Complete.

O problema são dois, não estou conseguindo colocar tudo dentro de um array e acho que a query que estou fazendo está errado.

Estou usando o VRaptor 3, no meu Controller chamo esse método busca.

O erro que aparece é 404 quando gera o URI /produto/busca?nome=Atari

Mas se eu colocar só /produto/busca da NullPointerException.

O return está errado, ele pede um array e eu estou tentando retornar uma String

Se alguém poder me ajudar agradeço muito.


public List<Produto> busca(String nome){
	result.include("nome", nome);
	return this.produtoDAO.busca(nome);
}

public List<Produto> busca(String nome) {
		
		List encontrados = new ArrayList();
		
		CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
		CriteriaQuery<String> criteriaQuery = criteriaBuilder.createQuery(String.class);
		
		Root<Produto> root = criteriaQuery.from(Produto.class);
		
		//criteriaBuilder.equal(root.<Produto>get("nome"), nome);

                //O problema é aqui, não sei o que fazer com essa linha e tb se ela está certa
		criteriaQuery.where(criteriaBuilder.like(root.<Produto>get("Produto").<String>get("nome"), nome));
		
		return this.em.createQuery(criteriaQuery).getSingleResult();
			
		//List<Predicate> criteria = new ArrayList<Predicate>();
		//criteria.add(Restrictions.like("nome", nome, MatchMode.ANYWHERE));
		//Predicate conjunto = criteriaBuilder.conjunction();
		//criteriaQuery.where(conjunto);
		
	}

[quote]Mas se eu colocar só /produto/busca da NullPointerException. [/quote]Em qual linha? No erro que aparece ele mostra a linha bem na frente.

Quando eu busco a URI produtos/busca aparece esse erro

java.lang.NullPointerException
org.hibernate.ejb.criteria.path.AbstractPathImpl.unknownAttribute(AbstractPathImpl.java:110)
org.hibernate.ejb.criteria.path.AbstractPathImpl.locateAttribute(AbstractPathImpl.java:218)
org.hibernate.ejb.criteria.path.AbstractPathImpl.get(AbstractPathImpl.java:189)
DAO.ProdutoDAO.busca(ProdutoDAO.java:64)
controller.ProdutosController.busca(ProdutosController.java:71)

no produtoDAO é bem a linha do where

E no controller é no return do metodo

Obrigado!

Pois é mano, tem algum objeto desse where que está null.

Dá uma debugada aí e veja. [=

Então jakefrog eu tentei mas não consegui fazer um debug, sou noob ainda em java, to começando agora =(

Procurei na net como fazer mas não encontrei como fazer, não sei se com o Vraptor é diferente.

Coloquei os break points no método busca mas quando eu executo ele não para onde eu quero.

Você tem algo ai que possa me ajudar a fazer esse debug?

Eu vou tentar agora criar uma classe main e tentar passar esse nome para a função. Se for assim me avisa que eu vou tocando aqui.

Abraços!

Olá aquino.will,

você usou:

root.<Produto>get("Produto").<String>get("nome")

mas o root já é um produto, então seria apenas:

root.<String>get("nome")

o hibernate poderia dar uma exceção melhor pra isso… mas acho que é esse o problema… dá uma olhada também se o nome está vindo null.

Ola Lucas,

Valeu cara!!!

Então se alguém tiver o mesmo problema que eu com o Debug é só criar um Método Main, criar a instância da sua classe.

Produto produto = new Produto();

e depois chamar o metodo

produto.busca("um nome qualquer");

Isso parece bastante obvio mas para mim custo 2 dias kkkk

Então Lucas e jakefrog

Fiz o de debug e estranhamente ele para na construção na fabrica do Criteria

CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();

E da NullPointerException aqui !!!

Agora não sei mais nada

Logo a cima tenho outra Criteria que faz a busca de todos os resultados do banco, isso pode influenciar em outro método?


public List<Produto> listaTudo(){
		CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
		CriteriaQuery<Produto> criteriaQuery = criteriaBuilder.createQuery(Produto.class);
		criteriaQuery.from(Produto.class);
		List<Produto> resultList = em.createQuery(criteriaQuery).getResultList();
		return resultList;
	}

Abraços!

Então,

No debug eu tenho que criar um EntityManager na mão para poder ter uma conexão, por isso estava dando erro.

Agora executa o método todo mas da erro de IllegalStateException.

Pelo que achei na Internet esse erro é por causa de uma chamada indevida ou no tempo errado.

O erro está nessa linha

return this.em.createQuery(criteriaQuery).getSingleResult();

Então tenho que fazer algo antes de executar e query. O que eu não sei, estou pesquisando.

Se alguém poder dar uma ajuda.

Abraços!

aquino.will, só o nome da exception não diz mta coisa… principalmente se for uma exceção padrão do java (pacote java.lang)

qual é a mensagem da exception? onde ela acontece? quais são as causas da exception (caused by)?

Bom dia Lucas,

Então cara o erro que gero foi esse. Não sei o que fazer mais.


HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

br.com.caelum.vraptor.InterceptionException: exception raised, check root cause for details: java.lang.IllegalStateException: No explicit selection and an implicit one cold not be determined
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:96)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:87)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:51)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
root cause

java.lang.IllegalStateException: No explicit selection and an implicit one cold not be determined
	org.hibernate.ejb.criteria.CriteriaQueryImpl.validate(CriteriaQueryImpl.java:309)
	org.hibernate.ejb.criteria.CriteriaQueryCompiler.compile(CriteriaQueryCompiler.java:93)
	org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:432)
	DAO.ProdutoDAO.busca(ProdutoDAO.java:61)
	controller.ProdutosController.busca(ProdutosController.java:71)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	br.com.caelum.vraptor.interceptor.ExecuteMethodInterceptor.intercept(ExecuteMethodInterceptor.java:61)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ParametersInstantiatorInterceptor.intercept(ParametersInstantiatorInterceptor.java:87)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:59)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.util.jpa.JPATransactionInterceptor.intercept(JPATransactionInterceptor.java:51)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.LazyInterceptorHandler.execute(LazyInterceptorHandler.java:61)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.FlashInterceptor.intercept(FlashInterceptor.java:83)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ExceptionHandlerInterceptor.intercept(ExceptionHandlerInterceptor.java:71)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:56)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.InstantiateInterceptor.intercept(InstantiateInterceptor.java:48)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.interceptor.ResourceLookupInterceptor.intercept(ResourceLookupInterceptor.java:69)
	br.com.caelum.vraptor.core.ToInstantiateInterceptorHandler.execute(ToInstantiateInterceptorHandler.java:54)
	br.com.caelum.vraptor.core.DefaultInterceptorStack.next(DefaultInterceptorStack.java:54)
	br.com.caelum.vraptor.core.EnhancedRequestExecution.execute(EnhancedRequestExecution.java:44)
	br.com.caelum.vraptor.VRaptor$1.insideRequest(VRaptor.java:92)
	br.com.caelum.vraptor.ioc.spring.SpringProvider.provideForRequest(SpringProvider.java:58)
	br.com.caelum.vraptor.VRaptor.doFilter(VRaptor.java:89)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.23 logs.
java.lang.IllegalStateException: No explicit selection and an implicit one cold not be determined

posta o código do DAO.ProdutoDAO.busca(ProdutoDAO.java:61)
provavelmente deu algum problema com o select da query.

de qqer modo, em geral para nome de pacote usamos .., e tudo em minúscula. Ex: br.com.suaempresa.seuprojeto.dao


public String busca(String nome) {
		CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
		CriteriaQuery<String> criteriaQuery = criteriaBuilder.createQuery(String.class);
		Root<Produto> root = criteriaQuery.from(Produto.class);
		criteriaQuery.where(criteriaBuilder.like(root.<String>get("nome"), nome));
		
		return this.em.createQuery(criteriaQuery).getSingleResult();
	
		
		
		//criteriaBuilder.equal(root.<Produto>get("nome"), nome);
		//List<Predicate> criteria = new ArrayList<Predicate>();
		//criteria.add(Restrictions.like("nome", nome, MatchMode.ANYWHERE));
		//Predicate conjunto = criteriaBuilder.conjunction();
		//criteriaQuery.where(conjunto);
		
	}

vc fez um:

criteriaBuilder.createQuery(String.class);

então ele espera que vc faça um select pra algum campo que retorne uma String. Se vc quer que ele retorne um Produto, vc tem que fazer um criteriaBuilder.createQuery(Produto.class);

Lucas,

Puts cara era isso mesmo, não acredito que era só isso !!!

Muito obrigado mesmo, agora vou colocar todo os resultados no array e quando terminar finalizo o post colocando a solução.

Valeu mesmo.

Abraços!

Ola Pessoal,

Finalizado e add no List.

Muito Obrigado a todos abraços!


//ProdutoDAO

public List<Produto> busca(String nome) {
		List<Produto> listProdutos = new ArrayList<Produto>();
		CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
		CriteriaQuery<Produto> criteriaQuery = criteriaBuilder.createQuery(Produto.class);
		Root<Produto> root = criteriaQuery.from(Produto.class);
		criteriaQuery.where(criteriaBuilder.like(root.<String>get("nome"), nome));
		listProdutos = this.em.createQuery(criteriaQuery).getResultList();
		return listProdutos;
}

// ProdutoController


public List<Produto> busca(String nome){
		result.include("nome", nome);
		return this.produtoDAO.busca(nome);
}