java - 组织.hsqldb.HsqlException : data exception: invalid character value for cast

标签 java sql jdbc hsqldb

我在 HSQL 数据库中有一个表,它有一个标识(整数)列。我想支持使用任意字符串(可能是非数字)对列进行查询。但是,HSQL JDBC 驱动程序尝试将查询参数转换为整数并抛出异常。 Oracle 驱动程序似乎可以很好地支持这种情况。

有什么想法可以改变 hsql 驱动程序中的这种行为吗?

org.hsqldb:hsqldb:2.3.0

表格:

CREATE TABLE some_table(id IDENTITY NOT NULL);

查询:

final String query = "SELECT * FROM some_table WHERE id=?";

String id = "abc";
jdbcTemplate.query(query, new PreparedStatementSetter() {
    @Override
    public void setValues(PreparedStatement ps) throws SQLException {
        ps.setString(1, id);
    }
}, someMapper);

异常:

org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [SELECT * FROM some_table WHERE id=?]; data exception: invalid character value for cast; nested exception is java.sql.SQLDataException: data exception: invalid character value for cast
    at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:80)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:605)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:639)
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:668)
    .
    .
    .
Caused by: java.sql.SQLDataException: data exception: invalid character value for cast
    at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCUtil.throwError(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.setParameter(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.setString(Unknown Source)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.setString(DelegatingPreparedStatement.java:135)
    at org.apache.commons.dbcp.DelegatingPreparedStatement.setString(DelegatingPreparedStatement.java:135)
    at com.stackoverflow.SomeDao$2.setValues(SomeDao.java:39)
    at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:644)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:589)
    ... 33 more
Caused by: org.hsqldb.HsqlException: data exception: invalid character value for cast
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.Scanner.convertToNumber(Unknown Source)
    at org.hsqldb.types.NumberType.convertToType(Unknown Source)
    ... 40 more

最佳答案

问题来自尝试将数字列与非数字字符串进行比较。在比较之前尝试将字符串转换为数字,如果它不是作为字符串的数字,则会引发强制转换异常。

一些解决方法:

  • 将字符串更改为长字符串。作为非 hsql 数据源,这不是一个真正的选择 需要支持任意字符串 ID。

  • dao 可以检查字符串是否为数字,然后才进行 询问。这是可以接受的,但我希望不必这样做。

关于java - 组织.hsqldb.HsqlException : data exception: invalid character value for cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18842454/

相关文章:

php - 从数据库中选择偏移量

java - 准备好的语句中的串联

java - 如何启用 JDBC/MySqlConnectorj 连接池?

java - 如何在另一个类中测试我的方法?

java - SwingWorker 没有响应

java - Hibernate GUID 本地生成器

mysql - 使用 count 函数对两个表中的记录进行计数,即使计数为零也返回相同的记录

java - 当服务器名称包含反斜杠 (localhost\TESTDATA) 时使用 JDBC

java - Spring mvc 空数组作为默认值

java File.listFiles() 顺序无法保证并导致 JUnit 测试失败