Problema de Type Cast

6 respostas
Jedi_FeniX

Estou tendo problema de type cast quando tento acessar um objeto dentro de um List, sendo que este list é gerado pelo EntiyManager.

Abaixo segue a classe mapeada, que é ela que será retornada dentro do list:
@Entity
public class Package implements Serializable {

    @Id
    @Column( name = "id_queue" )
    private Long idPackage;

    @Column( name = "weight" )
    private int weight;

    @Embedded
    @AttributeOverrides({
        @AttributeOverride( name = "idApplication", column = @Column( name = "id_application" ) )
    })
    private Application application;

    @Embedded
    @AttributeOverrides({
        @AttributeOverride( name = "msisdn", column = @Column( name = "msisdn" ) )
    })
    private Customer customer;

    @Embedded
    @AttributeOverrides({
        @AttributeOverride( name = "la", column = @Column( name = "la" ) ),
        @AttributeOverride( name = "message", column = @Column( name = "message" )  ),
        @AttributeOverride( name = "externalID", column = @Column( name = "more_info" ) )
    })
    private SMS sms;

    @Embedded
    @AttributeOverrides({
        @AttributeOverride( name = "ip", column = @Column( name = "ip", insertable = false, updatable = false  ) ),
        @AttributeOverride( name = "port", column = @Column( name = "port" ) ),
        @AttributeOverride( name = "path", column = @Column( name = "path" ) ),
        @AttributeOverride( name = "clazz", column = @Column( name = "class") ),
        @AttributeOverride( name = "group", column = @Column( name = "server_group" ) ),
        @AttributeOverride( name = "typeServer", column = @Column( name = "type_server" ) )
    })
    private Server server; 
}
Abaixo segue o error que é gerado:
[#|2010-02-02T15:53:48.518-0200|SEVERE|glassfishv3.0|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=30;_ThreadName=Thread-1;|javax.ejb.EJBException
        at com.sun.ejb.containers.BaseContainer.processSystemException(BaseContainer.java:5070)
        at com.sun.ejb.containers.BaseContainer.completeNewTx(BaseContainer.java:4968)
        at com.sun.ejb.containers.BaseContainer.postInvokeTx(BaseContainer.java:4756)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1955)
        at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1906)
        at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:198)
        at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:84)
        at $Proxy206.getPackages(Unknown Source)
        at br.com.gateway.test.ee.dao.TestQueueDAO.processRequest(TestQueueDAO.java:44)
        at br.com.gateway.test.ee.dao.TestQueueDAO.doGet(TestQueueDAO.java:82)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:734)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
        at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
        at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
        at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
        at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:332)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:233)
        at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
        at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
        at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
        at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
        at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
        at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
        at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
        at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
        at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
        at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
        at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
        at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
        at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
        at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
        at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to br.com.gateway.bean.Package
        at br.com.gateway.ee.ejb.dao.QueueDAO.getPackages(QueueDAO.java:63)
        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:5243)
        at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:615)
        at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797)
        at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:567)
        at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:157)
        at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:139)
        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 com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:858)
        at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797)
        at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:367)
        at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5215)
        at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5203)
        at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:190)

6 Respostas

marcelo.bellissimo

Posta o seu método getPackages() …

Jedi_FeniX

O método getPackages fica dentro da classe QueueDAO:

@Stateless
public class QueueDAO implements QueueDAOLocal {

   @TransactionAttribute( TransactionAttributeType.REQUIRED )
    public List<Package> getPackages(Long idSMS, int limit) {
        long startTime = System.currentTimeMillis();
        String query = "select * from \"queue\".\"get_queue_to_send\"( ?, ? ) as ( id_queue bigint,id_application integer,msisdn varchar, " +
                       "message varchar,more_info varchar,la varchar,type_server varchar, \"class\" varchar,ip varchar, " +
                       "port integer,\"path\" varchar,server_group varchar,weight integer);";
        List<Package> packages = null;
        try {
            packages = this.getEntityManager().createNativeQuery( query )
                    .setParameter( 1, idSMS.intValue() )
                    .setParameter( 2, limit )
                    .getResultList();
            LOGGER.debug( this.token + " Submitted query:" + query + " Parameters for query: id_sms = " + idSMS +
                    " limit = " + limit );
            LOGGER.info( this.token + " Total time for query getPackages: " + TimeUtil.calculateTime( startTime ) + "s" );
        } catch(Exception e) {
            LOGGER.error( this.token, new Throwable( e ) );
        }
        return packages;
    }

}
Jedi_FeniX

Achei o problema, eu tenho que passar o class que eu quero que retorne abaixo segue o exemplo:

... packages = this.getEntityManager().createNativeQuery( query, Package.class ) ...
Só que acabei entrando em um outro erro, como dentro da classe Package eu tenho outro objetos e dentro dele tem atributos eu acabo caindo no erro abaixo:

[#|2010-02-02T17:51:52.791-0200|INFO|glassfishv3.0|javax.enterprise.system.std.com.sun.enterprise.v3.services.impl|_ThreadID=32;_ThreadName=Thread-1;| java.lang.Throwable: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query at br.com.acotel.gateway.sms.ee.ejb.dao.QueueDAO.getPackages(QueueDAO.java:61) 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:5243) at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:615) at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797) at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:567) at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:157) at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:139) 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 com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:858) at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797) at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:367) at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5215) at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5203) at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:190) at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:84) at $Proxy188.getPackages(Unknown Source) at br.com.acotel.gateway.sms.test.ee.dao.TestQueueDAO.processRequest(TestQueueDAO.java:44) at br.com.acotel.gateway.sms.test.ee.dao.TestQueueDAO.doGet(TestQueueDAO.java:82) at javax.servlet.http.HttpServlet.service(HttpServlet.java:734) at javax.servlet.http.HttpServlet.service(HttpServlet.java:847) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:332) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:233) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) at com.sun.grizzly.ContextTask.run(ContextTask.java:69) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) at java.lang.Thread.run(Thread.java:619) Caused by: javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute query at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:804) at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:219) at br.com.acotel.gateway.sms.ee.ejb.dao.QueueDAO.getPackages(QueueDAO.java:53) ... 52 more Caused by: org.hibernate.exception.SQLGrammarException: could not execute query at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:90) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.loader.Loader.doList(Loader.java:2235) at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2129) at org.hibernate.loader.Loader.list(Loader.java:2124) at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:312) at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1658) at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:165) at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:175) at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:210) ... 53 more Caused by: org.postgresql.util.PSQLException: The column name date_deleted was not found in this ResultSet. at org.postgresql.jdbc2.AbstractJdbc2ResultSet.findColumn(AbstractJdbc2ResultSet.java:2562) at org.postgresql.jdbc2.AbstractJdbc2ResultSet.getTimestamp(AbstractJdbc2ResultSet.java:2466) at com.sun.gjc.spi.base.ResultSetWrapper.getTimestamp(ResultSetWrapper.java:576) at org.hibernate.type.TimestampType.get(TimestampType.java:53) at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:184) at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:173) at org.hibernate.type.AbstractType.hydrate(AbstractType.java:105) at org.hibernate.type.ComponentType.hydrate(ComponentType.java:588) at org.hibernate.persister.entity.AbstractEntityPersister.hydrate(AbstractEntityPersister.java:2216) at org.hibernate.loader.Loader.loadFromResultSet(Loader.java:1402) at org.hibernate.loader.Loader.instanceNotYetLoaded(Loader.java:1330) at org.hibernate.loader.Loader.getRow(Loader.java:1228) at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:601) at org.hibernate.loader.Loader.doQuery(Loader.java:722) at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:257) at org.hibernate.loader.Loader.doList(Loader.java:2232) ... 60 more
Alguém sabe como solucionar este erro?

E

Isso não lhe diz nada?

Jedi_FeniX

Sim… mas eu gostaria de não retornar este valor.

C

Jedi,
certamente o segundo erro é em relação a query. Mas no primeiro, da uma olhadinha no forum do Hibernate, mas até onde eu sei, “native querys” não são facilmente transformadas (cast) para objetos específicos. Tens que utilizar HQL puro, algo como “SELECT p.weight FROM Package p WHERE p.idPackage = ?”.

Att,
Carvo.

Criado 2 de fevereiro de 2010
Ultima resposta 8 de mar. de 2010
Respostas 6
Participantes 4