Snowflake文档指出queryId是一个UUID。与其尝试将其作为PreparedStatement中的一个参数来工作,我将验证它是否是一个有效的UUID,这将确保它不会受到SQL注入的攻击。
我正试图在使用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(?))
在准备好的语句中工作?
尝试将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);