如何将BigInteger从java传递到Postgres?

如何将BigInteger从java传递到Postgres?,java,spring,postgresql,jdbc,postgresql-9.2,Java,Spring,Postgresql,Jdbc,Postgresql 9.2,我需要向SQL查询传递一个BigInteger参数。(关于博士后9.2) 我的DAO中有以下代码: public List<PersonInfo> select(String id) { BigInteger bigIntId = new BigInteger(id); JdbcTemplate select = new JdbcTemplate(dataSource); return select .q

我需要向SQL查询传递一个BigInteger参数。(关于博士后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());
    }
id的类型为bigint

试图传递普通字符串-也引发类型异常。 谷歌搜索了异常中的消息-没有相关结果。
有什么想法吗

biginger
的支持是在JDBC4.1(Java7)中添加的,在我最初编写这个答案时,不知何故我错过了这一点

具体而言,第3.1节JDBC 4.1规范变更概述说明:

  • 表B-4的其他映射,从Java对象到JDBC类型的映射
    […]
    还添加了对将
    java.lang.biginger
    [sic]映射到JDBC
    BIGINT
    的支持
  • Java对象类型和目标JDBC类型之间由
    setObject
    setNull
    执行到表B-5的其他映射
    […]
    允许将
    java.lang.biginger
    [sic]转换为
    CHAR
    VARCHAR
    LONGVARCHAR
    BIGINT
我不确定这在驱动程序中得到了多大程度的支持

原始答案
JDBC规范不支持
biginger
;您或者需要使用不同的数据类型(例如缩放为0的
BigDecimal
),或者了解PostgreSQL驱动程序是否提供了一些特定于实现的方法来设置
BigInteger
值。

我也遇到了同样的问题,使用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();
            }
        });

}
@Transactional
公共void saveStuff(列出foos){
int batchSize=foos.size();
String sql=“插入db.foo”+
(sting_id、大整数、条形等)+
“价值(?,,,…等)”;
batchUpdate(sql,新的BatchPreparedStatementSetter()){
@凌驾
公共void setValues(PreparedStatement ps,int i)引发SQLException{
FeedEntry=feedEntries.get(i);
int指数=1;
ps.setString(index++,foo.id());
ps.setObject(index++,foo.getthebiginger(),Types.BIGINT);
ps.setString(index++,foo.bar())
//等
}
@凌驾
public int getBatchSize(){
返回foos.size();
}
});
}

您可以使用
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());
}
公共列表选择(字符串id){
BigDecimal bigDecId=新的BigDecimal(id);
JdbcTemplate select=新的JdbcTemplate(数据源);
返回选择
.query(“从PE.SUPPLIER\u输入数据中选择*,其中ID=?”,
新对象[]{bigDecId},
新PersonRowMapper());
}

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

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

org.postgresql
postgresql
${postgresql.version}

ID属于哪种数据类型?JDBC规范不支持
BigInteger
;您可能需要使用不同的数据类型(例如,小数位数为0的BigDecimal),也可能需要了解PostgreSQL驱动程序是否提供了一些特定于实现的方法来设置BigInteger值。请尝试将其传递为可行的方式?改为使用java.lang.Long。@Mark Rottevel,介意将您的注释作为答案发布吗,那么我可以接受吗?@valijon建议您编辑不合适。该类名为
java.math.biginger
,这是正确的,但这是来自JDBC 4.1规范的文字引用,该规范有此错误。
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>${postgresql.version}</version>
    </dependency>