我需要向SQL query传递一个BigInteger参数。(在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
尝试传递普通字符串-也抛出类型异常。谷歌了异常中的消息-没有相关的结果。有什么想法吗?
发布于 2017-07-19 20:05:36
我也有同样的问题,使用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-11-02 21:54:22
您可以使用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());
}
发布于 2018-06-06 05:38:22
我也有同样的问题,我把驱动从9.3升级到了42.2.2。那就工作得很好。
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${postgresql.version}</version>
</dependency>
https://stackoverflow.com/questions/16357679
复制相似问题