参数为布尔值时,Databricks 和 JdbcTemplate 查询错误

问题描述 投票:0回答:1

在 Java 17 上,最新的 databricks-jdbc 依赖项,Spring 5.3.20

当我使用 JdbcTemplate 查询表并且其中一个参数是布尔值时,我收到一条错误消息:

查询:

SELECT rowkey, sendReminder FROM SOME_TABLE WHERE sendReminder = ?
参数:true(布尔值)

错误:

org.springframework.jdbc.UncategorizedSQLException: PreparedStatementCallback; uncategorized SQLException for SQL [SELECT rowkey, sendReminder FROM SOME_TABLE WHERE sendReminder = ?]; SQL state [HY000]; error code [500352]; [Databricks][JDBCDriver](500352) Error getting the parameter data type: HIVE_PARAMETER_QUERY_DATA_TYPE_ERR_NON_SUPPORT_DATA_TYPE; nested exception is java.sql.SQLException: [Databricks][JDBCDriver](500352) Error getting the parameter data type: HIVE_PARAMETER_QUERY_DATA_TYPE_ERR_NON_SUPPORT_DATA_TYPE

```at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1542)```

当我运行相同的查询但在 Java 代码中使用 PraparedStatement 时,查询有效。

有人见过这个吗?已知问题?

谢谢!

jdbc databricks jdbctemplate
1个回答
0
投票

数据类型是布尔型 - 除非我弄错了,否则它是受支持的,因为我做了以下 2 个实验:

  1. 使用带有额外参数的queryForList,手动指定参数类型,其中argTypes使用java.sql.Types.BOOLEAN(num value == 16)

jdbcTemplate.queryForList(sql, args.toArray(), argTypes);

  1. 使用准备好的声明

结果集结果集 = null; 尝试(PreparedStatement准备语句= dataSource.getConnection()。prepareStatement(sql)){ preparedStatement.setBoolean(1, (Boolean) args.get(0));

两者都工作正常。我对 JdbcTemplate 源代码进行了一些深入调试,似乎仅使用 queryForList(sql, args) 时,布尔值的参数类型被标记为“java.sql.Types.BIT”。根据 JDBC 规范,这是可以接受的,但 Databricks 无法处理该问题。 spring-jdbc jdbcTemplate(sql, args) 方面并没有错,只是采用了“最佳猜测”。

© www.soinside.com 2019 - 2024. All rights reserved.