I’m using Oracle 11g R2. I have a table with 9.1 billion rows. When I try to run a criteria query which contains Projections.rowCount() (which I need to do to get the number of rows in the table) using either .list() or .uniqueResult(), I get a Numeric Overflow exception.
The relevant part of the stack trace:
java.sql.SQLException: Numeric Overflow
oracle.jdbc.driver.NumberCommonAcessor?throwOverFlow
oracle.jdbc.driver.NumberCommonAcessor?getInt
oracle.jdbc.driver.OracleResultSetImpl?getInt
oracle.jdbc.driver.OracleResultSet?getInt
org.hibernate.type.IntegerType?get <---------------- oops.
org.hibernate.type.NullableType?nullSafeGet
org.hibernate.type.NullableType?nullSafeGet
org.hibernate.loader.criteria.CriteriaLoader?getResultColumnOrRow
org.hibernate.loader.Loader.getRowFromResultSet
org.hibernate.loader.Loader.doQuery
org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections
org.hibernate.loader.Loader.doList
org.hibernate.loader.Loader.listIgnoreQueryCache
org.hibernate.loader.Loader.list
org.hibernate.loader.criteria.CriteriaLoader?list
org.hibernate.impl.SessionImpl?.list
org.hibernate.impl.CriteriaImpl?.list
mypackage.myclass.GetRowCount
Hibernate is deciding to use an Integer to store the result regardless of the table size. How can I override this behaviour?
Use a SQLProjection using a return
Typelarge enough for your result.