如何将BigInteger从java传递给Postgres?

时间:2013-05-03 11:16:07

标签: java spring postgresql jdbc postgresql-9.2

我需要将一个BigInteger参数传递给SQL查询。 (在Postgres 9.2上) 我在DAO中有这个代码:

    public List<PersonInfo> select(String id) {
        BigInteger bigIntId = new BigInteger(id);
        JdbcTemplate select = new JdbcTemplate(dataSource);
        return select
            .query("SELECT * FROM PE.SUPPLIER_INPUT_DATA WHERE ID = ?",
                    new Object[] { bigIntId },
                    new PersonRowMapper());
    }

我收到以下异常:

{"error":"Error invoking getPersonInfoById.[org.springframework.jdbc.BadSqlGrammarException: PreparedStatementCallback; 
bad SQL grammar [SELECT * FROM PE.SUPPLIER_INPUT_DATA WHERE ID = ?]; 
nested exception is org.postgresql.util.PSQLException: 
Can't infer the SQL type to use for an instance of java.math.BigInteger. 
Use setObject() with an explicit Types value to specify the type to use.]"}

id类型为bigint

尝试传递普通字符串 - 也抛出类型异常。 在异常中用Google搜索消息 - 没有相关结果。 有任何想法吗?

4 个答案:

答案 0 :(得分:5)

在JDBC 4.1(Java 7)中添加了对BigInteger的支持,不知怎的,当我最初写这个答案时我错过了。

具体部分3.1 JDBC 4.1规范更改概述:

  
      
  • 表B-4的附加映射,从Java对象到JDBC类型的映射
      [..]
      还添加了支持以将java.lang.BigInteger映射到JDBC BIGINT
  •   
  • 表B-5的附加映射,由setObjectsetNull在Java对象类型和目标JDBC类型之间执行
      [..]
      允许将java.lang.BigInteger转换为CHARVARCHARLONGVARCHARBIGINT
  •   

我不确定这对驱动程序的支持程度如何。

原始答案

JDBC规范不包括对BigInteger的支持;您需要使用不同的数据类型(例如BigDecimal和0),或者查看PostgreSQL驱动程序是否提供了一些特定于实现的方法来设置BigInteger值。

答案 1 :(得分:1)

我遇到了同样的问题,使用Types.BIGINT作为改进工作。我将它与BatchPreparedStatementSetter结合使用,这很简单且非常易读:

 @Transactional
public void saveStuff(List<Foo> foos) {
    int batchSize = foos.size();

    String sql = "INSERT INTO db.foo " +
            "(sting_id, a_big_integer, bar, ..etc ) " +
            "VALUES (?, ?, ?, ..etc )";

        jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {
            @Override
            public void setValues(PreparedStatement ps, int i) throws SQLException {
                FeedEntry feedEntry = feedEntries.get(i);
                int index = 1;
                ps.setString(index++, foo.id());
                ps.setObject(index++, foo.getTheBigInteger(), Types.BIGINT);
                ps.setString(index++, foo.bar())
                //etc
            }

            @Override
            public int getBatchSize() {
                return foos.size();
            }
        });

}

答案 2 :(得分:0)

您可以使用java.math.BigDecimal转换BigInt。 以下代码应该有效:

public List<PersonInfo> select(String id) {

    BigDecimal bigDecId = new BigDecimal(id);
    JdbcTemplate select = new JdbcTemplate(dataSource);
    return select
        .query("SELECT * FROM PE.SUPPLIER_INPUT_DATA WHERE ID = ?",
                new Object[] { bigDecId },
                new PersonRowMapper());
}

答案 3 :(得分:0)

我遇到了同样的问题,我将驱动程序从9.3更新到42.2.2。然后工作得很好

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>${postgresql.version}</version>
    </dependency>