java - H2:WHERE 子句中的 "data conversion error"

标签 java database oracle exception h2

我在项目中使用 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 转换是透明的)。

请提出可能是什么问题以及解决此问题的更好方法?

最佳答案

Oracle 中不推荐使用

(+) 外连接语法。停止使用它。

在你的情况下,“外部连接”无论如何都没有意义,因为你没有加入。

你可能想要这样的东西(它在所有 DBMS 上可靠地工作)

select * 
from table_country c 
where c.code > 0 
  and (c.name = 'USA' or c.name is null);

最后一句话:使用不同的 DBMS 进行测试和生产会使您的测试毫无值(value)。使用不同的 DBMS 时,您根本无法涵盖 DBMS 之间的细微差别。

关于java - H2:WHERE 子句中的 "data conversion error",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16150650/

相关文章:

java - 如何配置 jdk14 日志记录模式

python - 使用 SQLAlchemy 关联代理强制唯一性

mysql - 在数据库中设置选定行的最佳实践

sql - Oracle SQL : select from table with nested table

java - 有没有办法在 Java 中生成 8.3 或 'short' (Windows) 版本的文件名?

java - 重载静态变量是否需要静态后期绑定(bind)?

oracle - 将 Crystal Report 命令参数传递给 Oracle 函数

sql - 如何增加每个非连续值的计数?

网络上的 Java 序列化

Django View 返回过时的数据,在服务器重新启动后修复