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);
}