5

我在 PostgreSQL 9.1 中有一个带有 bigint 类型列的视图。这种类型在 Java 中应该映射到Long,但实际上映射到BigInteger. 所以

resultSet.getLong(columnPos)

导致 ArrayIndexOutOfBoundsException。

resultSet.getBigInteger(columnPos)

或者

resultSet.get(columnPos)

跟随toString和解析都可以正常工作。对此的正确处理是什么?我应该先获取BigInteger,调用toString并解析Long吗?或者是否有更好的方法来告诉ResultSetScrollableResults正确的 Java 列类型?

谢谢你。

4

3 回答 3

1

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
}
于 2011-11-16T09:20:41.567 回答
0

使用 jdbc 插入 BigInteger 值时

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")));
于 2013-09-26T07:10:48.883 回答
0

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 上似乎是安全的。

于 2017-02-22T02:46:09.950 回答