org.hsqldb.HsqlException: données d'exception: valeur de caractère non valide pour les acteurs

J'ai une table dans une base de données HSQL qui a une identité(entier) de la colonne. J'aimerais en charge les requêtes contre la colonne à l'aide d'une chaîne de caractères arbitraire(potentiellement non-numérique). Cependant, la HSQL pilote JDBC essaie de lancer la requête paramètre un entier et renvoie une exception. Le pilote Oracle semble soutenir ce cas l'amende.

Toutes les idées pour modifier ce comportement dans les hsql pilote?

org.hsqldb:hsqldb:2.3.0

La table:

CREATE TABLE some_table(id IDENTITY NOT NULL);

La requête:

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);

L'exception:

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
SELECT * FROM some_table WHERE id='abc' ne pas faire de aucun sens. Pourquoi voulez-vous à la recherche de caractères dans une colonne qui est connue pour ne contenir aucun. Si vous ne pouvez pas convertir l'entrée de l'utilisateur pour un certain nombre, vous pouvez sauter l'ensemble de la requête de base de données et disply "Rien trouvé" pour l'utilisateur car vous il ne peut pas y avoir de matchs.
Je l'ai déjà mentionné cela comme une solution de contournement. Je préfère pas le faire à travers les différentes daos. Son facile de manquer un spot
Je ne comprends toujours pas pourquoi vous voulez le faire dans la première place. Comparer des pommes à des oranges semble plutôt inutile. Une solution possible serait de jeter le colonne pour une représentation des caractères: SELECT * FROM some_table WHERE cast(id as varchar(20)) = 'abc'. Mais qui empêcherait l'utilisation d'un index sur cette colonne.

OriginalL'auteur Kyle | 2013-09-17