6

我需要将 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

试图传递纯字符串 - 也会引发类型异常。谷歌搜索异常中的消息 - 没有相关结果。有任何想法吗?

4

4 回答 4

5

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

特别是 JDBC 4.1 规范变更的 3.1 节概述:

  • 表 B-4 的附加映射,从 Java 对象到 JDBC 类型的映射
    [..]
    还添加了对映射java.lang.BigInteger[原文如此]到 JDBC的支持BIGINT
  • 表 B-5 的附加映射,由Java 对象类型和目标 JDBC 类型执行setObject以及在它们之间执行 [..] 允许将[sic]转换为、、和.setNull

    java.lang.BigIntegerCHARVARCHARLONGVARCHARBIGINT

我不确定驱动程序对此的支持程度。

原始答案

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

于 2013-05-03T11:44:49.440 回答
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();
            }
        });

}
于 2017-07-19T12:05:36.090 回答
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());
}
于 2017-11-02T13:54:22.287 回答
0

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

    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>${postgresql.version}</version>
    </dependency>
于 2018-06-05T21:38:21.747 回答