2016-07-08 1 views
1

Я новичок в метамодели apache. Я использую его для получения суммы любого числового столбца в таблице базы данных, используя следующий код:Метамодель Apache бросает исключение, пытаясь получить сумму очень большого числа числовых данных

 Object object = null; 
     long sum = 0; 
     String columnName = table.getColumn(iColumnNumber).getName(); 
     Query query = dataContext.query().from(table).select(FunctionType.SUM, table.getColumnByName(sColumnName)).toQuery(); 
     org.eobjects.metamodel.data.DataSet ds = dataContext.executeQuery(query); 
     try { 
      ds.next(); 
      org.eobjects.metamodel.data.Row row = ds.getRow(); 
      try { 
       object = row.getValue(0); 
      } catch (Exception ex) { 
       return 0; 
      } 
      if (object instanceof java.lang.Long) { 
       sum = (long) object; 
      } else if (object instanceof BigDecimal) { 
       sum = ((BigDecimal) object).longValue(); 
      } else if (object instanceof java.lang.Integer) { 
       sum = ((java.lang.Integer) object).longValue(); 
      } 

     } catch (Exception ex) { 
      return 0; 
     } finally { 
      if (ds != null) { 
       ds.close(); 
      } 
     } 

код отлично работает для небольших данных, но когда я пытаюсь тот же код для очень больших данных, содержащих сотни тысяч строк , Код генерирует исключение: Не удалось получить следующую запись в наборе результатов: Ошибка арифметического переполнения, преобразующая выражение в тип данных int.

Когда я запускаю тот же запрос, используя функцию sum в таблице базы данных непосредственно в окне сценария dbms, я получаю такую ​​же ошибку. Если я передам результат функции sum() в bigint или числовой тип данных, запрос возвращает сумму без каких-либо ошибок. Поэтому я думаю, что эту ошибку можно решить, добавив результат функции sum() в подходящий тип данных в метамодели apache. Так может ли кто-нибудь дать мне знать, как я могу передать результат запроса в другой тип данных, например десятичный, а не по умолчанию тип int.

ответ

0

Сначала несколько небольших замечаний о вашем коде:

  • Будьте осторожны с глотанием исключения. Вы должны, как минимум, регистрировать исключения, которые происходят - прямо сейчас вы просто возвращаете 0, что вводит в заблуждение.
  • Вместо того, чтобы обрабатывать целое число, длинные и т. Д. По-разному, почему бы просто не позволить вашему методу вернуть номер?

касаемо arithmethic проблема переполнения, если база данных действительно возвращает BigDecimal (довольно необычно, но базы данных иногда, как это), то вы, вероятно, следует смотреть на вопросы/ответы, такие как Converting BigDecimal to Integer

Смежные вопросы