我正在尝试从浏览器接受列表,并在SQL查询中将其用于Postgres数据库。我有以下代码片段,试图显示我已经做到这一点的功能。万一出现差异,某些变量将被更改。
static public List<Map<String,Object>> fetch(NamedParameterJdbcTemplate jdbcTemplate, List<Integer> id){
List<Map<String,Object>> result= new ArrayList<>();
String sql = "select * from lookup where id && ARRAY[ :ids ]";
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("ids",id, Types.INTEGER);
result= jdbcTemplate.query(sql,
parameters,
new RowMapper<Map<String,Object>>() { ...
}
)
}
查找表id字段是一个postgress数组,因此我需要使用&&和数组函数
此函数由许多不同的端点调用,并传递NamedParameterJdbcTemplate以及整数列表。我遇到的问题是,如果列表中的任何整数是<100,我将收到以下消息
Bad value for type int : {20}
还有另一种方法可以解决此错误吗?
编辑:
看来这是问题的一部分,但也使用了
rs.getInt(col)
代替
rs.getArray(col)
答案 0 :(得分:0)
我可以在SQL中看到一个错误,并且此后可能选择了错误的API。首先查询:
select * from lookup where id && ARRAY[ :ids ]
要绑定数组参数,一定不要将其放在ARRAY
构造函数中,而是需要像这样使用JDBC绑定:
select * from lookup where id && ?
您已经注意到,在这些示例中,我没有使用命名参数,因为NamedParameterJdbcTemplate
没有提供获取java.sql.Connection
对象或它的代理的途径。如果改用PreparedStatementSetter
界面,则可以通过JdbcOperations
访问它。
public static List<Map<String,Object>> fetch(NamedParameterJdbcTemplate jdbcTemplate, List<Integer> idlist){
List<Map<String,Object>> result= new ArrayList<>();
String sql = "select * from lookup where id && ?";
final Integer[] ids = idlist.toArray(new Integer[0]);
PreparedStatementSetter parameters = new PreparedStatementSetter() {
@Override
void setValues(PreparedStatement stmt) {
Connection conn = stmt.getConnection();
// this can only be done through the Connection
java.sql.Array arr = conn.createArrayOf("integer", ids);
// you can use setObject(1, ids, java.sql.Types.ARRAY) instead of setArray
// in case the connection wrapper doesn't pass it on to the JDBC driver
stmt.setArray(1, ids);
}
};
JdbcOperations jdo = jdbcTemplate.getJdbcOperations();
result= jdo.query(sql,
parameters,
new RowMapper<Map<String,Object>>() { ...
}
)
}
由于我通常使用一组不同的API,因此代码中可能存在错误,并且在该java.sql.SQLException
函数中您需要为setValues
使用try-catch块,但是您应该能够从这里开始处理。