#java #oracle #hibernate #jdbc
#java #Oracle #гибернация #jdbc
Вопрос:
Я использую Oracle 11g R2. У меня есть таблица с 9,1 миллиардами строк. Когда я пытаюсь выполнить запрос критериев, который содержит Projections.rowCount()
(что мне нужно сделать, чтобы получить количество строк в таблице), используя либо .list()
, либо .uniqueResult()
, я получаю исключение числового переполнения.
Соответствующая часть трассировки стека:
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 решает использовать целое число для сохранения результата независимо от размера таблицы. Как я могу переопределить это поведение?
Ответ №1:
Используйте SQLProjection, используя return, Type
достаточно большой для вашего результата.
Комментарии:
1. Похоже, это исправлено. Вместо использования
criteria.setProjection(Projections.rowCount())
я используюcriteria.setProjection(new SQLProjection("count(*) as ROWCOUNT", new String[]{"ROWCOUNT"}, new Type[]{new LongType()})