无法在 H2 数据库中使用联接

Posted

技术标签:

【中文标题】无法在 H2 数据库中使用联接【英文标题】:Cannot Use Joins in H2 Database 【发布时间】:2019-02-26 03:23:59 【问题描述】:

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

日志文件报告说,一些成功执行的 SELECT 语句只有一个参与表,例如从 T1 中选择 ...;

但是,当它到达语句中的一个简单的 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 的问题是什么?

【问题讨论】:

代码是什么?通过谷歌搜索错误消息并在手册中找到它,您学到了什么? minimal reproducible example PS 你在混合, & JOINFROM吗? @philipxy 我没有包含代码,因为它似乎无关紧要,因为我什至无法在我的任何表上执行简单的JOIN,即使它运行也会产生上述错误在 H2 控制台本身中。所以我推测问题不在于应用程序,而是 H2 有问题。正如我所说,我可以运行没有JOIN 的简单查询并检索应用程序插入的结果,但任何其他查询都会在 H2 控制台(Web 界面)中输出此错误。不,我无法在 Internet 上找到与此确切错误相关的任何内容。 【参考方案1】:

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

很奇怪,H2 会因此而完全崩溃,并且不会让其中包含 JOIN 的语句被执行,而没有 JOIN 的简单查询可以正常工作。

【讨论】:

以上是关于无法在 H2 数据库中使用联接的主要内容,如果未能解决你的问题,请参考以下文章

无法在laravel中内部联接多个ID用于数据表

无法在 h2 内存数据库中插入数据

基于 Java 的 H2 数据库无法在 CLASSPATH 中找到项目

无法将大型数据集加载到 h2 数据库中

使用内部联接删除一行数据[重复]

H2 控制台无法访问 jbdc 数据库