PostgreSQL resultSet.getLong () приводит к ArrayIndexOutOfBoundsException, когда тип столбца - bigint - PullRequest
5 голосов
/ 16 ноября 2011

У меня есть представление в PostgreSQL 9.1 со столбцом типа bigint. Этот тип должен быть сопоставлен с Long в Java, но фактически сопоставлен с BigInteger. Итак

resultSet.getLong(columnPos)

приводит к исключению ArrayIndexOutOfBoundsException.

resultSet.getBigInteger(columnPos)

или

resultSet.get(columnPos)

оба с последующим toString и синтаксический анализ работают нормально. Какова будет правильная обработка этого? Должен ли я сначала получить BigInteger, позвонить toString и разобрать Long? Или есть ли лучший способ сообщить ResultSet или ScrollableResults правильный тип столбца Java?

Спасибо.

Ответы [ 3 ]

1 голос
/ 16 ноября 2011

Тип данных bigint правильно сопоставлен с BigInteger, так как он говорит: это большое целое число, которое может не вписаться в Long.

Вы можете использовать resultSet.get(columnPos), а затем проверитькласс возвращаемого объекта.

Мы написали для этого вспомогательный класс, поэтому мы сделаем что-то вроде этого:

public Long getLongFromResultSet( ResultSet rs, int columnPos ) {
  Object value = rs.get( columnPos );

  if( value instanceof Number) { //this should handle any numeric Java type like BigInteger, Long etc.
    return ((Number)value).longValue(); //autoboxing here
  }  

  ... //handle non-Number cases
}
0 голосов
/ 22 февраля 2017

FWIW, в текущей реализации PostgreSQL JDBC (pgjdbc) это, похоже, не проблема: getLong отлично работает на столбцах BIGINT. Текущая реализация даже не реализует ничего под названием getBigInteger. https://github.com/pgjdbc/pgjdbc/blob/master/pgjdbc/src/main/java/org/postgresql/jdbc/PgResultSet.java

Кроме того, getLong кажется безопасным для SMALLINT, INT и BIGINT.

0 голосов
/ 26 сентября 2013

При вставке значения BigInteger с использованием jdbc

BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number 
statement.setObject(1, bi, Types.BIGINT);
statement.execute();

при чтении набора результатов: если facebok_id имеет тип BigInteger

value.setFacebook_id(BigInteger.valueOf(rs.getLong("facebook_id")));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...