Запрос критериев гибернации с использованием проекций.rowCount() вызывает числовое переполнение

#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()})