我在我的项目中使用 H2 数据库 (v1.3.170) 进行 JUnit 测试。我们的生产环境使用 Oracle DB,因此我们必须对从 Oracle 导出的 DDL 进行大量转换,以使其与 H2 一起使用。我们现在面临的问题之一是:
select * from table_country c where c.code > 0 AND 'USA' = c.name(+)
此查询在 Oracle 中运行良好,但在 H2 中失败,堆栈跟踪如下:
org.h2.jdbc.JdbcSQLException: Data conversion error converting "USA"; SQL statement:
select * from table_country c where c.code>0 AND 'USA' = c.name(+) [22018-170]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:329)
at org.h2.message.DbException.get(DbException.java:158)
at org.h2.value.Value.convertTo(Value.java:852)
at org.h2.value.Value.getBoolean(Value.java:373)
at org.h2.expression.ConditionAndOr.optimize(ConditionAndOr.java:188)
at org.h2.command.dml.Select.prepare(Select.java:802)
at org.h2.command.Parser.prepareCommand(Parser.java:218)
at org.h2.engine.Session.prepareLocal(Session.java:414)
at org.h2.server.TcpServerThread.process(TcpServerThread.java:253)
at org.h2.server.TcpServerThread.run(TcpServerThread.java:149)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NumberFormatException
at java.math.BigDecimal.<init>(Unknown Source)
at java.math.BigDecimal.<init>(Unknown Source)
at org.h2.value.Value.convertTo(Value.java:801)
... 8 more
我尝试删除(+) - 它有效:
select * from table_country c where c.code > 0 AND 'USA' = c.name
但正如我所说,我不想在生产中改变这一点(希望 Oracle => H2 转换是透明的)。
请提出可能是什么问题以及解决此问题的更好方法?