使用Java和Snowflake,如何在准备好的语句中使用queryId进行查询



我正试图在使用JdbcTemplate的Spring Boot Java应用程序中使用Snowflake函数TABLE(RESULT_SCAN(queryId))。我希望这个函数在一个准备好的语句中工作,但它不起作用,因为?不会被提供的参数替换。注意:Spring Boot JdbcTemplate正在根据提供的参数创建一个准备好的语句。

执行查询的代码:

String queryId = "99352ad6-a577-48e5-9b99-07f1f7dd6fc6"; //let's just use this as an example
String sql = "SELECT COUNT(*) FROM TABLE(RESULT_SCAN(?))";
Integer total = jdbcTemplate.queryForObject(sql,
new Object[]{queryId},
new int[]{Types.VARCHAR},
Integer.class);

这导致了一个异常:

org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [SELECT COUNT(*) FROM TABLE(RESULT_SCAN(?))]; SQL compilation error:
argument needs to be a string: '1'; nested exception is net.snowflake.client.jdbc.SnowflakeSQLException: SQL compilation error:
argument needs to be a string: '1'

如何让TABLE(RESULT_SCAN(?))在准备好的语句中工作?

Snowflake文档指出queryId是一个UUID。与其尝试将其作为PreparedStatement中的一个参数来工作,我将验证它是否是一个有效的UUID,这将确保它不会受到SQL注入的攻击。

尝试将queryId强制转换为String:

String sql = "SELECT COUNT(*) FROM TABLE(RESULT_SCAN(?))";
Integer total = jdbcTemplate.queryForObject(sql,
new Object[]{queryId.toString()},
new int[]{Types.VARCHAR},
Integer.class);

最新更新