Java查询Snowflake报Numeric value '{userId}' is not recognized错误如何解决
问题解决方案
根因说明
报错和userId是否转int无关,核心问题是SQL写法错误:你在SQL中硬编码了'{userId}'字符串,使用的{userId}不是Spring JdbcTemplate支持的占位符格式,传入的参数根本没有替换到SQL中,请求到Snowflake的SQL始终携带{userId}字符串,和NUMBER类型的ID字段比较时就会触发数值不识别的报错。
修复方案
改用JDBC标准的?作为预编译占位符,不要手动给占位符加单引号,参数传入转换后的数值类型即可适配Snowflake的NUMBER字段要求,示例代码如下:
public void getTransactionHistoryTest(String userId) { // 用?作为预编译占位符,无需加单引号 String query = "SELECT * FROM \"TEST\".\"PUBLIC\".\"USER_TABLE\" WHERE \"ID\" = ?"; // 转换为数值类型传入参数即可 jdbcTemplate.query(query, rs -> { // 结果集处理逻辑 }, Long.parseLong(userId)); }
注意事项
- 数值类型的参数不需要手动加单引号,JDBC预编译会自动根据参数类型处理格式
- 如果你的ID字段数值超过int的最大值(2^31-1),请转换为Long类型避免溢出
- 禁止直接拼接SQL参数,预编译的写法既能避免类型适配问题,也能防范SQL注入风险
可选扩展方案
如果你更习惯使用命名占位符,可以改用NamedParameterJdbcTemplate,避免多参数时顺序对应错误,示例如下:
public void getTransactionHistoryTest(String userId) { String query = "SELECT * FROM \"TEST\".\"PUBLIC\".\"USER_TABLE\" WHERE \"ID\" = :userId"; MapSqlParameterSource paramSource = new MapSqlParameterSource() .addValue("userId", Long.parseLong(userId)); namedParameterJdbcTemplate.query(query, paramSource, rs -> { // 结果集处理逻辑 }); }
内容的提问来源于stack exchange,提问作者user9347049
相关产品推荐
相关产品推荐

