6

ID(整数)列を持つ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
4

2 に答える 2

8

この問題は、数値列を数値以外の文字列と比較しようとした場合に発生します。文字列は比較の前に数値に変換され、文字列としての数値でない場合はキャスト例外がスローされます。

いくつかの回避策:

  • String を long に変更します。非 hsql データソースは任意の文字列 ID をサポートする必要があるため、これは実際にはオプションではありません。

  • dao は、文字列が数値であることを確認してから、クエリを作成できます。これは許容されますが、これを行う必要がないことを望んでいました。

于 2014-08-16T02:24:34.200 に答える
0

私にとってはこれ

原因: java.sql.SQLDataException: データ例外: ステートメントのキャストに無効な文字値 [select * from x where x.status = 'READY_FOR_WRITE']

つまり、休止状態を使用していて、デフォルトでは列挙型の文字列ではなく整数としてステータスを作成していました。 修正します。

于 2021-07-01T21:35:32.280 に答える