1

SnappyData v.0-5 w/ ClientDriver JDBC 驱动程序。

我在 SnappyData 中有一个名为:sensor_data 的持久行表。

在 snappy> shell 中,此查询返回数千行。

snappy> select * from sensor_data where year_num = 2013 and month_num = 1;

从 SpringBoot 中的 JDBC 连接运行时,出现此错误:

PreparedStatementCallback; SQL [select * from sensor_data where year_num = ? 和month_num = ?]; SQL 状态 [XCL14];错误代码[20000];(SQLState=XCL14 Severity=20000) 列位置“1”超出范围。此 ResultSet 的列数为“0”。

Java代码是:

List<SensorData> list = jdbcTemplateBean.query("select * from sensor_data where year_num = ? and month_num = ?", 
                new Object[] {year, month},  new SensorDataRowMapper());

我需要做什么来解决这个 JDBC 问题?

在 Spring 启动时修剪 Stacktrace:

org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; SQL [select * from sensor_data where year_num = ? 和month_num = ?]; SQL 状态 [XCL14];错误代码[20000];(SQLState=XCL14 Severity=20000) 列位置“1”超出范围。此 ResultSet 的列数为“0”。嵌套异常是 java.sql.SQLException: (SQLState=XCL14 Severity=20000) 列位置 '1' 超出范围。此 ResultSet 的列数为“0”。在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 在 org.springframework 的 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:84)。(SQLState=XCL14 Severity=20000) 列位置“1”超出范围。此 ResultSet 的列数为“0”。... 引起:错误 XCL14:列位置 '1' 超出范围。此 ResultSet 的列数为“0”。在 com.pivotal.gemfirexd.internal.client.am.ColumnMetaData.checkForValidColumnIndex(ColumnMetaData.java:856) 在 com.pivotal.gemfirexd.internal.client.am.ColumnMetaData.getColumnType(ColumnMetaData.java:638) ... 72更多的

4

2 回答 2

1

问题已解决。这是发生了什么...... SnappyData 将查询路由到 Spark,因为它确定它无法处理它。Spark 对 JDBC PreparedStatements 或绑定变量一无所知,并引发了错误。为了解决这个问题,我必须在我的 DataSource 配置中设置 SnappyData JDBC 属性“route-query = false”。这确保了它不会被路由到 Spark。

于 2016-08-02T23:07:13.347 回答
1

从堆栈看来,正在使用NamedParameterJdbcTemplate但是“?” 正在使用占位符。对于NamedParameterJdbcTemplate,您需要像这里一样使用命名参数。

我会推荐使用标准“?” 使用JdbcTemplate的占位符机制,例如:

private JdbcTemplate jdbcTemplateBean;

public void setDataSource(DataSource dataSource) {
  this.jdbcTemplateBean = new JdbcTemplate(dataSource);
}

List<SensorData> list = jdbcTemplateBean.query(
    "select * from sensor_data where year_num = ? and month_num = ?",
    new Object[] { year, month },  new SensorDataRowMapper());
于 2016-07-27T06:59:31.093 回答