我最近将HSQL从1.8.0.10升级到2.0,然后升级到2.0.1.rc3,而我的代码或测试数据没有任何变化。我有很多以前工作的测试,现在我得到很多涉及“投射”的例外......
Caused by: org.hsqldb.HsqlException: data exception: invalid character value for cast
不幸的是,异常消息很差,并且让我接下来不知道哪个列等是坏的。
其他异常表明它试图将sysadmin用户名抱怨为长?
Caused by: org.hsqldb.HsqlException: incompatible data type in conversion: from SQL type VARCHAR to java.lang.Long, value: SA
at org.hsqldb.error.Error.error(Error.java:77)
... 54 more
真的很奇怪,这是我在内存模式下使用HSQL并将其启动为空并且从不设置任何访问内容。
PS
我还将Hibernate更新为3.6。
答案 0 :(得分:1)
我刚刚遇到类似的问题,升级到HSQLDB 2.2.9后,一些单元测试开始失败并显示以下错误消息:
java.sql.SQLSyntaxErrorException: incompatible data type in conversion: from SQL type VARCHAR to java.math.BigDecimal, value: SA
仅在使用DBUnit操作数据集时才会出现此问题,使用Hibernate时没有问题。在打开JDBC日志记录之后,我发现DBUnit在这样的选择之后失败了:
select id, user from MYTABLE order by id
// then, SQLSyntaxErrorException when DBUnit tried to retrieve the 'user' column:
BigDecimal userId = resultSet.getBigDecimal(2);
This answer引导我找到原因:默认情况下,DBUnit不会转义'user'关键字,这解释了为什么错误消息的值为“SA”,这是默认的HSQLDB系统用户。但是,DBUnit确实让你configure escaping解决了问题。
最后,Hibernate没有问题的原因是它生成的SQL更明确,例如。
select mytable0.id, mytable0.user from MYTABLE mytable0 order by mytable0.id
<强>要点:强>
找出哪些库没有在SQL语句中转义关键字!
答案 1 :(得分:0)
版本2.x中的自动投射行为变得更加严格。这可能会解决问题,但是如果没有看到实际的表定义和Hibernate执行的语句,就不可能说出来。广泛的Hibernate测试套件使用最新的HSQLDB RC运行时只有很少(和无关)的错误。
答案 2 :(得分:0)
我们在打包自定义版本的hsqldb时遇到了同样的问题(需要解决此问题Hibernate/hsqldb 2 Cannot Hydrate Blob Column)
当前的hsqldb源jar包含旧版本的org.hibernate,它无法正确识别hsqldb版本(具有讽刺意味)。如果你的构建中包含了这个源,那么它可能覆盖该类的实际hibernate 3.6版本。
检查hsqldb jar依赖项内部,看看它是否包含任何org.hibernate类
或者尝试在代码中添加以下内容,以查看正在使用的方言的来源:
System.out.println(
new HSQLDialect().getClass().getProtectionDomain().getCodeSource());