Numeric Overflow com JPA Hibernate

Ola Amigos,

Estou recebendo um erro na execução de uma query

Caused by: org.hibernate.exception.GenericJDBCException: could not execute query
	at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.loader.Loader.doList(Loader.java:2231)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125)
	at org.hibernate.loader.Loader.list(Loader.java:2120)
	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
	at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:361)
	at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1148)
	at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
	at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:67)
	... 73 more
Caused by: java.sql.SQLException: Numeric Overflow
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208)
	at oracle.jdbc.driver.NumberCommonAccessor.throwOverflow(NumberCommonAccessor.java:7465)
	at oracle.jdbc.driver.NumberCommonAccessor.getInt(NumberCommonAccessor.java:123)
	at oracle.jdbc.driver.OracleResultSetImpl.getInt(OracleResultSetImpl.java:521)
	at oracle.jdbc.driver.OracleResultSet.getInt(OracleResultSet.java:1563)
	at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.getInt(DelegatingResultSet.java:275)
	at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.getInt(DelegatingResultSet.java:275)
	at org.hibernate.type.IntegerType.get(IntegerType.java:51)
	at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:184)
	at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:173)
	at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1121)
	at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:588)
	at org.hibernate.loader.Loader.doQuery(Loader.java:724)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
	at org.hibernate.loader.Loader.doList(Loader.java:2228)

Na tabela em questão existe uma coluna NUMBER.

Name              Null Type           
----------------- ---- -------------- 
EVENT_NO      NUMBER         

A tabela esta mapeada assim


@Id
@Column(name = "EVENT_NO")
private Integer id; 

Acontece que o valor retornado pela query (2535872295) e maior que integer que vai ate 2147483647.

Tentando mudar o meu tipo java para Long, recebo um

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

O que fazer agora? Alguém tem uma solução?

Será que alterando no banco e no seu mapeamento ORM não funciona, apenas um chute

Mude o tipo do seu id para Long.

Nao posso mudar o banco e isto esta em produção.

Ja tentei mudar o id para diversos tipos, Long, Float, BigInteger, nada funciona.

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.math.BigInteger

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

Parece que o hibernate so esta aceitando um Integer ali!!!

E Double na sua entidade, já tentou?

Ja sim.

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double

[quote=JoseBarros]Ola Amigos,

Estou recebendo um erro na execução de uma query

Caused by: org.hibernate.exception.GenericJDBCException: could not execute query
	at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.loader.Loader.doList(Loader.java:2231)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125)
	at org.hibernate.loader.Loader.list(Loader.java:2120)
	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
	at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:361)
	at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1148)
	at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
	at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:67)
	... 73 more
Caused by: java.sql.SQLException: Numeric Overflow
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208)
	at oracle.jdbc.driver.NumberCommonAccessor.throwOverflow(NumberCommonAccessor.java:7465)
	at oracle.jdbc.driver.NumberCommonAccessor.getInt(NumberCommonAccessor.java:123)
	at oracle.jdbc.driver.OracleResultSetImpl.getInt(OracleResultSetImpl.java:521)
	at oracle.jdbc.driver.OracleResultSet.getInt(OracleResultSet.java:1563)
	at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.getInt(DelegatingResultSet.java:275)
	at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.getInt(DelegatingResultSet.java:275)
	at org.hibernate.type.IntegerType.get(IntegerType.java:51)
	at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:184)
	at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:173)
	at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1121)
	at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:588)
	at org.hibernate.loader.Loader.doQuery(Loader.java:724)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
	at org.hibernate.loader.Loader.doList(Loader.java:2228)

Na tabela em questão existe uma coluna NUMBER.

Name              Null Type           
----------------- ---- -------------- 
EVENT_NO      NUMBER         

A tabela esta mapeada assim


@Id
@Column(name = "EVENT_NO")
private Integer id; 

Acontece que o valor retornado pela query (2535872295) e maior que integer que vai ate 2147483647.

Tentando mudar o meu tipo java para Long, recebo um

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

O que fazer agora? Alguém tem uma solução?

[/quote]

não tem alguma FK no seu banco utilizando este campo, seja como referenciador ou como referenciado?

outra coisa que ia sugerir o teste é mudar para double ou float (primitivo mesmo).

[quote=maior_abandonado][quote=JoseBarros]Ola Amigos,

Estou recebendo um erro na execução de uma query

Caused by: org.hibernate.exception.GenericJDBCException: could not execute query
	at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126)
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.loader.Loader.doList(Loader.java:2231)
	at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125)
	at org.hibernate.loader.Loader.list(Loader.java:2120)
	at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401)
	at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:361)
	at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
	at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1148)
	at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
	at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:67)
	... 73 more
Caused by: java.sql.SQLException: Numeric Overflow
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
	at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208)
	at oracle.jdbc.driver.NumberCommonAccessor.throwOverflow(NumberCommonAccessor.java:7465)
	at oracle.jdbc.driver.NumberCommonAccessor.getInt(NumberCommonAccessor.java:123)
	at oracle.jdbc.driver.OracleResultSetImpl.getInt(OracleResultSetImpl.java:521)
	at oracle.jdbc.driver.OracleResultSet.getInt(OracleResultSet.java:1563)
	at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.getInt(DelegatingResultSet.java:275)
	at org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.getInt(DelegatingResultSet.java:275)
	at org.hibernate.type.IntegerType.get(IntegerType.java:51)
	at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:184)
	at org.hibernate.type.NullableType.nullSafeGet(NullableType.java:173)
	at org.hibernate.loader.Loader.getKeyFromResultSet(Loader.java:1121)
	at org.hibernate.loader.Loader.getRowFromResultSet(Loader.java:588)
	at org.hibernate.loader.Loader.doQuery(Loader.java:724)
	at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259)
	at org.hibernate.loader.Loader.doList(Loader.java:2228)

Na tabela em questão existe uma coluna NUMBER.

Name              Null Type           
----------------- ---- -------------- 
EVENT_NO      NUMBER         

A tabela esta mapeada assim


@Id
@Column(name = "EVENT_NO")
private Integer id; 

Acontece que o valor retornado pela query (2535872295) e maior que integer que vai ate 2147483647.

Tentando mudar o meu tipo java para Long, recebo um

java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long

O que fazer agora? Alguém tem uma solução?

[/quote]

não tem alguma FK no seu banco utilizando este campo, seja como referenciador ou como referenciado?

outra coisa que ia sugerir o teste é mudar para double ou float (primitivo mesmo).

[/quote]

Ja tentei, double, float e tanto objeto como primitivo. Mesmo problema. E nao tem FK utilizando esse campo!

Alguem tem alguma outra ideia???

Mesmo problema!

Alguém sabe a solução?

Resolvi dessa forma:

Pode ver que dá exceção em um monte de getInt()
Provavelmente é a propriedade ID ou alguma outra propriedade do tipo integer da sua entidade, que na hora que faz o Parse do registro para um objeto, ele não consegue colocar aquele valor porque não tem espaço.

Provavelmente algum valor de campo Inteiro de algum registro que está no retorno desta consulta (query) é tão grande que não cabe na propriedade do objeto.
Tente trabalhar com os próximos tipos inteiros ( long, Long BigInteger) em todos os campos do tipo Integer de sua entidade.

Eu tive um problema parecido, eu tinha um registro que tinha um id = 994999219998213259939 (exemplo)

Este id era do tipo Long no objeto e quando eu fazia a query, este registro estava nesta listagem e não funcionava. numeric overflow ! resolvi trocando o tipo Long para BIGINTEGER

Espero ter ajudado.

Até mais.