首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将BigInteger从java传递到Postgres?

如何将BigInteger从java传递到Postgres?
EN

Stack Overflow用户
提问于 2013-05-03 19:16:07
回答 3查看 12K关注 0票数 6

我需要向SQL query传递一个BigInteger参数。(在Postgres 9.2上)我的DAO中有以下代码:

代码语言:javascript
复制
    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());
    }

我得到了以下异常:

代码语言:javascript
复制
{"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

尝试传递普通字符串-也抛出类型异常。谷歌了异常中的消息-没有相关的结果。有什么想法吗?

EN

回答 3

Stack Overflow用户

发布于 2017-07-19 20:05:36

我也有同样的问题,使用Types.BIGINT作为改进工作。我将它与BatchPreparedStatementSetter结合使用,这很简单,而且可读性很好:

代码语言:javascript
复制
 @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();
            }
        });

}
票数 1
EN

Stack Overflow用户

发布于 2017-11-02 21:54:22

您可以使用java.math.BigDecimalBigInt进行转换。下面的代码应该可以工作:

代码语言:javascript
复制
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());
}
票数 0
EN

Stack Overflow用户

发布于 2018-06-06 05:38:22

我也有同样的问题,我把驱动从9.3升级到了42.2.2。那就工作得很好。

代码语言:javascript
复制
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>${postgresql.version}</version>
    </dependency>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16357679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档