使用java和snowflake,如何在准备好的语句中使用queryid进行查询?

6vl6ewon  于 2021-08-25  发布在  Java
关注(0)|答案(2)|浏览(387)

我正在尝试使用雪花功能 TABLE(RESULT_SCAN(queryId)) 在spring引导java应用程序中使用jdbctemplate。我希望此函数在准备好的语句中工作,但它不工作,因为?不会被提供的参数替换。注意:SpringBootJDBCTemplate正在根据提供的参数创建一个准备好的语句。
执行查询的代码:

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(?)) 在事先准备好的声明中工作?

taor4pac

taor4pac1#

试着投出 queryId 要设置字符串,请执行以下操作:

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

vh0rcniy2#

雪花文档声明queryid是uuid。我将验证它是否是有效的uuid,这将确保它不易受到sql注入的攻击,而不是尝试将其作为preparedstatement中的参数使用。

相关问题