首页 > 解决方案 > 无法在 H2 数据库中使用联接

问题描述

在使用 H2 (1.3.168) 作为本地数据库时通过 Java Hibernate 执行某些查询时遇到了一个奇怪的问题。Hibernate 似乎尝试执行一系列 SELECT 语句,但其中一个因模糊错误而失败。

日志文件报告了一些成功执行的 SELECT 语句只有一个参与表,例如 SELECT ... FROM T1 WHERE ...;

但是,当它到达语句中的简单 LEFT OUTER JOIN 语句时,会产生以下错误:

General error: "java.lang.NoClassDefFoundError: org/h2/table/TableFilter$2" [50000-168]

我采用了 Hibernate 报告的完全相同的查询,并尝试直接在 H2 控制台中执行它。同样的错误。

我用一个简单的 JOIN 替换了 LEFT OUTER JOIN,同样的错误。我从 JOIN 中删除了第二个表,并从第一个表中删除了 SELECT,它 SELECT 就好了。自己对第二张桌子做了同样的事情,没问题,例如

SELECT * FROM T1;

尝试了一堆其他带有连接的表......错误再次出现。

SELECT * FROM T1 t1 JOIN T2 t2 ON t1.pk_id = t2.fk_id;

有谁知道H2的问题是什么?

标签: javahibernatejoinh2in-memory-database

解决方案


问题在于应用程序在开始执行时 drop-recreate 脚本中缺少的序列对象之一(与 Hibernate/Spring 无关)。在 H2 中分别运行脚本并将其与另一组创建/删除语句进行比较,以找出后者的工作原理,而不是前者。

非常奇怪的是,H2 完全因为这个而分崩离析,并且不会让JOIN其中的语句在没有正常工作的简单查询时被执行JOIN


推荐阅读