Problema nativeQuery utilizando left join! [RESOLVIDO]

13 respostas
D

Pessoal é o seguinte,
estou com um problema em uma consulta onde preciso utilizar o left join para trazer dados mesmo q um campo esteja null.
No banco funciona perfeitamente, mais quando coloco na minha aplicação utilizando nativeQuery ele busca os campos que possuem O MESMO NOME(porém em TABELAS DIFERENTES) como null, mesmo existindo valor.

Segue a baixo meu sql:

por exemplo ele tras o pc.nome, pl.nome, pa.nome quando o pc.nome é null.

Alguma sugestão?

Obrigado.

13 Respostas

pmlm

O teu problema não deve ter nada a ver com o left join mas sim com o teres três colunas com o mesmo nome.

D

[quote=pmlm]O teu problema não deve ter nada a ver com o left join mas sim com o teres três colunas com o mesmo nome.

Isso, ja tentei com o AS e não funcionou também!
da o seguinte erro:

INFO: FROM:  SELECT i.id, pc.nome AS pc_nome, pl.nome AS pl_nome, pa.nome AS pa_nome, i.data, i.valor   FROM itens_compras i  left join clientes c on c.id = i.id_cliente  left join pessoas pc on pc.id = c.id_pessoa  join lojas l on l.id = i.id_loja  join pessoas pl on pl.id = l.id_pessoa  join agencias a on a.id = i.id_agencia  join pessoas pa on pa.id = a.id_pessoa  where i.valor > 0   order by i.data 
GRAVE: br.com.ibasi.ishopp.business.BusinessException: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query

Alguma outra sugestão??

Vlw

pmlm

Mostra o código onde tens isso.

D
public Lista listaPorFiltro(Object filtro, Integer pagina, Boolean contem) throws BusinessException {
        ItemCompraFilter filter = (ItemCompraFilter) filtro;
        String sql = "SELECT i.id, pc.nome, pl.nome, pa.nome, i.data, i.valor FROM itens_compras i 
                                 left join clientes as c on c.id = i.id_cliente
                                 left join pessoas as pc on pc.id = c.id_pessoa
                                 join lojas as l on l.id = i.id_loja
                                 join pessoas as pl on pl.id = l.id_pessoa
                                 join agencias as a on a.id = i.id_agencia
                                 join pessoas as pa on pa.id = a.id_pessoa
                                 where i.valor > 0
                                 order by i.data;
        
        try {
            query = createNativeQuery(sql);
            montaPaginacao(query);
            List<Object[]> relatorio = query.getResultList();
            ItemCompraItem itemCompra;
            List<ItemCompraItem> lista = new ArrayList<ItemCompraItem>();
            for (Object[] o : relatorio) {
                itemCompra = new ItemCompraItem();
                itemCompra.setId((Integer) o[0]);
                itemCompra.setCliente((String) o[1]);
                itemCompra.setLoja((String) o[2]);
                itemCompra.setAgencia((String) o[3]);
                itemCompra.setData(Convert.dateToStr((Date) o[4]));
                itemCompra.setValor((Double) o[5]);
                lista.add(itemCompra);
            }
            return new Lista(lista);
        } catch ...

Estou realizando alguns testes nessa consulta ainda não esta completa!
Ta na mão o código…
Obrigado!

pmlm

E que erro dá assim como tens?

D

pmlm:
E que erro dá assim como tens?

Os campos pl.nome e pa.nome vem com o mesmo dado do pc.nome

pmlm

E utilizando alias como eu disse antes?

D

Eu nem consigo utilizar alias na nativeQuery (não me pergunte porque), se eu coloco em 1 campo funciona, agora se coloco em mais de um campo da o erro abaixo na linha em que pego o resultado!

SELECT i.id, pc.nome as pc_nome, pl.nome as pl_nome, pa.nome as pa_nome, i.data, i.valor  FROM itens_compras i
join clientes c on c.id = i.id_cliente
join pessoas pc on pc.id = c.id_pessoa
join lojas l on l.id = i.id_loja
join pessoas pl on pl.id = l.id_pessoa
join agencias a on a.id = i.id_agencia
join pessoas pa on pa.id = a.id_pessoa
where i.valor > 0
order by i.data;

ERRO:

GRAVE: br.com.ibasi.ishopp.business.BusinessException: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query

Direto no banco o SQL roda normalmente!

Obrigado!

pmlm

O erro não tem nenhuma pista sobre o que pode estar mal?

D

O erro completo:

GRAVE: br.com.ibasi.ishopp.business.BusinessException: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query
	at br.com.ibasi.ishopp.business.service.impl.ItemCompraServiceImpl.listaPorFiltro(ItemCompraServiceImpl.java:1735)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
	at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
	at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5388)
	at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)
	at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
	at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
	at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162)
	at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144)
	at sun.reflect.GeneratedMethodAccessor196.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861)
	at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
	at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:370)
	at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5360)
	at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5348)
	at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:214)
	at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:89)
	at $Proxy759.listaPorFiltro(Unknown Source)
	at br.com.ibasi.ishopp.client.mb.consulta.ItemCompraMB.busca(ItemCompraMB.java:91)
	at br.com.ibasi.ishopp.client.mb.ListingMB.paginaPrimeira(ListingMB.java:214)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at javax.el.BeanELResolver.invokeMethod(BeanELResolver.java:779)
	at javax.el.BeanELResolver.invoke(BeanELResolver.java:528)
	at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:257)
	at com.sun.el.parser.AstValue.invoke(AstValue.java:248)
	at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:302)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:148)
	at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
	at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
	at javax.faces.component.UICommand.broadcast(UICommand.java:300)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1550)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
	at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:662)
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147)
	at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:255)
	at br.com.ibasi.ishopp.business.service.impl.ItemCompraServiceImpl.listaPorFiltro(ItemCompraServiceImpl.java:1718)
	... 74 more
Caused by: org.hibernate.exception.SQLGrammarException: could not execute query
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.loader.Loader.doList(Loader.java:2536)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2276)
	at org.hibernate.loader.Loader.list(Loader.java:2271)
	at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:316)
	at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1842)
	at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165)
	at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:157)
	at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:246)
	... 75 more
Caused by: java.sql.SQLException: Column 'nome' not found.
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
	at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
	at com.mysql.jdbc.ResultSetImpl.findColumn(ResultSetImpl.java:1144)
	at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5616)
	at com.sun.gjc.spi.base.ResultSetWrapper.getString(ResultSetWrapper.java:426)
	at org.hibernate.type.descriptor.sql.VarcharTypeDescriptor$2.doExtract(VarcharTypeDescriptor.java:61)
	at org.hibernate.type.descriptor.sql.BasicExtractor.extract(BasicExtractor.java:64)
	at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:253)
	at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:249)
	at org.hibernate.type.AbstractStandardBasicType.nullSafeGet(AbstractStandardBasicType.java:234)
	at org.hibernate.loader.custom.CustomLoader$ScalarResultColumnProcessor.extract(CustomLoader.java:505)
	at org.hibernate.loader.custom.CustomLoader$ResultRowProcessor.buildResultRow(CustomLoader.java:451)
	at org.hibernate.loader.custom.CustomLoader.getResultColumnOrRow(CustomLoader.java:348)
	at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:639)
	at org.hibernate.loader.Loader.doQuery(Loader.java:829)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
	at org.hibernate.loader.Loader.doList(Loader.java:2533)
	... 82 more

Creio que ele não encontre a coluna nome!!

Vlw

pmlm

Certo, porque a coluna nome deixa de existir. Passam a existir as colunas pc_nome, pl_nome, pa_nome…

D

Pois é, ta complicado…
Alguma idéia?

Vlw pela ajuda…

D

Acabei resolvendo criando um campo com o nome que eu precisava em cada tabela.
Se alguém achar um jeito melhor me avise!

Vlw pela ajuda!

Criado 14 de fevereiro de 2013
Ultima resposta 27 de fev. de 2013
Respostas 13
Participantes 2