You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 21:45:03