【问题标题】:Numeric value '{userId}' is not recognized无法识别数值“{userId}”
【发布时间】:2021-12-12 14:54:09
【问题描述】:

我有一个用 Java 编写的 SQL 查询,如下所示:

public void getTransactionHistoryTest(String userId) {
     String q = "SELECT * FROM \"TEST\".\"PUBLIC\".\"USER_TABLE\" WHERE \"ID\"='{userId}'";
     return  jdbcTemplate.query(query, rs -> {
    }, userId);
    }

我在 Snowflake 中有一张表,其中 UserID 的类型为 NUMBER,我收到下一个错误:

无法识别数值“{userId}”

为了解决这个问题,我尝试将String userId 转换为int,如下所示:

int userId= Integer.parseInt(id);

但我仍然遇到同样的错误。

是否可以将String 值转换为int 并仍然使其在雪花中工作?

【问题讨论】:

  • 你有没有试过像String q = "SELECT * FROM \"TEST\".\"PUBLIC\".\"USER_TABLE\" WHERE \"ID\"" + userId;这样构建你的查询

标签: java sql spring-boot snowflake-cloud-data-platform


【解决方案1】:

尝试使用?字符而不是“{userId}”

public List<TransactionHistory> getTransactionHistoryTest(String userId) {
 String q = "SELECT * FROM \"TEST\".\"PUBLIC\".\"USER_TABLE\" WHERE \"ID\"=?";
 return jdbcTemplate.query(q, ROW_MAPPER, userId);
}

您的问题不是由用户 ID 的值引起的,而是由不正确的参数转义引起的。在您的情况下,您不需要命名参数 - 所以只需 ? 就可以了。否则使用命名参数模板。查看更多示例,即此处https://javabydeveloper.com/spring-jdbctemplate-query-examples/

另一种尝试方式:

String sql = "SELECT * FROM \"TEST\".\"PUBLIC\".\"USER_TABLE\" WHERE \"ID\" = ?";
jdbcTemplate.query(sql,
        new Object[] { userId },
        new int[] { Types.INTEGER },
        ROW_MAPPER);

【讨论】:

  • 我做了,但后来我得到了Bind variable ? not set.
  • 在这种情况下提供 SqlParameterValue 而不是用户 ID,即 new SqlParameterValue(Types.INTEGER, userId)。也请分享ROW_MAPPER相关代码
  • 抱歉,我不会使用 ROW_MAPPER,因为我的函数将返回 void。你能举个例子 SqlParameterValue(Types.INTEGER, userId) 我更新了我的代码
  • 无论如何你都需要行映射器来解释结果
  • 我怀疑你得到“绑定变量?未设置”,因为在 ROW_MAPPER 中传递了不正确的内容
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 2020-02-06
相关资源
最近更新 更多